From d0ccb01cd1ad7eb49bc077068ef5741cc672126c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 07:59:01 +0000 Subject: [PATCH 01/31] Bump rack from 3.1.11 to 3.1.12 (#2983) Bumps [rack](https://github.com/rack/rack) from 3.1.11 to 3.1.12. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/v3.1.11...v3.1.12) --- updated-dependencies: - dependency-name: rack dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index bcd977d68..3d1a3f0d3 100644 --- a/Gemfile.lock +++ b/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) From 11d9705fdd1cb1fd97187e6b191fe95831246b51 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 11 Mar 2025 08:18:29 +0000 Subject: [PATCH 02/31] Update address search results (#2981) * Update address search results * Add search controller tests * Check if the query is nil when using the address-search api * Refactor --------- Co-authored-by: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> --- app/controllers/address_search_controller.rb | 6 ++- .../address_search_controller_spec.rb | 40 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/controllers/address_search_controller.rb b/app/controllers/address_search_controller.rb index 616d5b702..74cda65c2 100644 --- a/app/controllers/address_search_controller.rb +++ b/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 diff --git a/spec/requests/address_search_controller_spec.rb b/spec/requests/address_search_controller_spec.rb index 5c2acd11a..7c8523abe 100644 --- a/spec/requests/address_search_controller_spec.rb +++ b/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 From 4d5f81490f773b31e0caa39ce0f9419b79190afe Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Tue, 11 Mar 2025 09:28:28 +0000 Subject: [PATCH 03/31] CLDC-3916: Lettings always show property information section 25/26 onwards (#2980) * Show lettings property information section always in 2025 * Add test --- .../lettings/subsections/property_information.rb | 2 ++ .../subsections/property_information_spec.rb | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/app/models/form/lettings/subsections/property_information.rb b/app/models/form/lettings/subsections/property_information.rb index 475ff0a8c..3b827bf48 100644 --- a/app/models/form/lettings/subsections/property_information.rb +++ b/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 diff --git a/spec/models/form/lettings/subsections/property_information_spec.rb b/spec/models/form/lettings/subsections/property_information_spec.rb index 2630c83d4..ed0add494 100644 --- a/spec/models/form/lettings/subsections/property_information_spec.rb +++ b/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 From 19eb437b61057b37bcb81d0f99e621ba0fbcfc44 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 11 Mar 2025 10:39:55 +0000 Subject: [PATCH 04/31] CLDC-3898 Correctly route to manual address entry for new builds (#2974) * Correclty set manual address entry for new builds * Refactor * Update BU tests * Keep the UPRN for newbuilds if given --- .../lettings_log_variables.rb | 9 +- app/models/lettings_log.rb | 8 + spec/models/lettings_log_spec.rb | 186 ++++++++++++++++++ 3 files changed, 202 insertions(+), 1 deletion(-) diff --git a/app/models/derived_variables/lettings_log_variables.rb b/app/models/derived_variables/lettings_log_variables.rb index 42dadf43c..1808aaab8 100644 --- a/app/models/derived_variables/lettings_log_variables.rb +++ b/app/models/derived_variables/lettings_log_variables.rb @@ -83,12 +83,19 @@ module DerivedVariables::LettingsLogVariables end set_housingneeds_fields if housingneeds? + if form.start_year_2025_or_later? && is_general_needs? + if changed_to_newbuild? && uprn.nil? + self.manual_address_entry_selected = true + end + + self.manual_address_entry_selected = address_answered_without_uprn? if changed_from_newbuild? + end self.uprn_known = 0 if address_answered_without_uprn? if uprn_known&.zero? self.uprn = nil - if uprn_known_was == 1 + if uprn_known_was == 1 && (rsnvac != 15 || !form.start_year_2025_or_later?) self.address_line1 = nil self.address_line2 = nil self.town_or_city = nil diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 920aed628..47ca80705 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -740,6 +740,14 @@ class LettingsLog < Log "lettings_log" end + def changed_to_newbuild? + rsnvac == 15 && rsnvac_was != 15 + end + + def changed_from_newbuild? + rsnvac != 15 && rsnvac_was == 15 + end + private def reset_invalid_unresolved_log_fields! diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index e9493a017..9f0ddec42 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -849,6 +849,192 @@ RSpec.describe LettingsLog do expect(lettings_log.reload.is_la_inferred).to eq(false) end end + + context "when the log changes from new build to not new build" do + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_call_original + Timecop.freeze(2025, 5, 1) + Singleton.__init__(FormHandler) + end + + after do + Timecop.unfreeze + end + + context "and the address is entered" do + let(:address_lettings_log) do + create(:lettings_log, + :setup_completed, + startdate: Time.zone.yesterday, + mrcdate: nil, + rsnvac: 15, + manual_address_entry_selected: true, + first_time_property_let_as_social_housing: 1, + address_line1: "Address line 1", + address_line2: "Address line 2", + town_or_city: "Town", + postcode_full: "AA1 1AA") + end + + it "keeps the manually entered address" do + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.uprn_selection).to eq(nil) + expect(address_lettings_log.uprn_known).to eq(0) + expect(address_lettings_log.uprn).to eq(nil) + expect(address_lettings_log.address_line1).to eq("Address line 1") + expect(address_lettings_log.address_line2).to eq("Address line 2") + expect(address_lettings_log.town_or_city).to eq("Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + + address_lettings_log.update!(rsnvac: 16) + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.address_line1).to eq("Address line 1") + expect(address_lettings_log.address_line2).to eq("Address line 2") + expect(address_lettings_log.town_or_city).to eq("Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + end + end + + context "and the address is not entered" do + let(:address_lettings_log) do + create(:lettings_log, + :setup_completed, + startdate: Time.zone.yesterday, + mrcdate: nil, + rsnvac: 15, + manual_address_entry_selected: true, + first_time_property_let_as_social_housing: 1, + address_line1: nil, + address_line2: nil, + town_or_city: nil, + postcode_full: nil) + end + + it "routes to the uprn question" do + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.uprn_selection).to eq(nil) + expect(address_lettings_log.uprn_known).to eq(0) + expect(address_lettings_log.uprn).to eq(nil) + expect(address_lettings_log.address_line1).to eq(nil) + expect(address_lettings_log.address_line2).to eq(nil) + expect(address_lettings_log.town_or_city).to eq(nil) + expect(address_lettings_log.postcode_full).to eq(nil) + + address_lettings_log.update!(rsnvac: 16) + expect(address_lettings_log.manual_address_entry_selected).to eq(false) + expect(address_lettings_log.uprn_selection).to eq(nil) + expect(address_lettings_log.uprn_known).to eq(nil) + end + end + end + + context "when the log changes from not new build to new build" do + before do + allow(FormHandler.instance).to receive(:current_lettings_form).and_call_original + Timecop.freeze(2025, 5, 1) + Singleton.__init__(FormHandler) + end + + after do + Timecop.unfreeze + end + + context "and the uprn is selected" do + let(:address_lettings_log) do + create(:lettings_log, + :setup_completed, + startdate: Time.zone.yesterday, + mrcdate: nil, + rsnvac: 17, + manual_address_entry_selected: false, + first_time_property_let_as_social_housing: 1, + uprn_selection: "1", + uprn_confirmed: "1", + uprn_known: "1", + uprn: "1") + end + + it "keeps the uprn" do + expect(address_lettings_log.manual_address_entry_selected).to eq(false) + expect(address_lettings_log.uprn).to eq("1") + expect(address_lettings_log.address_line1).to eq("1, Test Street") + expect(address_lettings_log.town_or_city).to eq("Test Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + + address_lettings_log.update!(rsnvac: 15) + expect(address_lettings_log.manual_address_entry_selected).to eq(false) + expect(address_lettings_log.address_line1).to eq("1, Test Street") + expect(address_lettings_log.town_or_city).to eq("Test Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + expect(address_lettings_log.uprn_selection).to eq("1") + expect(address_lettings_log.uprn).to eq("1") + expect(address_lettings_log.uprn_known).to eq(1) + end + end + + context "and the address is manually entered" do + let(:address_lettings_log) do + create(:lettings_log, + :setup_completed, + startdate: Time.zone.yesterday, + mrcdate: nil, + rsnvac: 16, + manual_address_entry_selected: true, + first_time_property_let_as_social_housing: 1, + uprn_selection: "uprn_not_listed", + address_line1: "Address line 1", + address_line2: "Address line 2", + town_or_city: "Town", + postcode_full: "AA1 1AA") + end + + it "keeps the manually entered address" do + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.address_line1).to eq("Address line 1") + expect(address_lettings_log.address_line2).to eq("Address line 2") + expect(address_lettings_log.town_or_city).to eq("Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + + address_lettings_log.update!(rsnvac: 15) + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.address_line1).to eq("Address line 1") + expect(address_lettings_log.address_line2).to eq("Address line 2") + expect(address_lettings_log.town_or_city).to eq("Town") + expect(address_lettings_log.postcode_full).to eq("AA1 1AA") + end + end + + context "and the address is not entered" do + let(:address_lettings_log) do + create(:lettings_log, + :setup_completed, + startdate: Time.zone.yesterday, + mrcdate: nil, + rsnvac: 17, + manual_address_entry_selected: false, + first_time_property_let_as_social_housing: 1, + address_line1: nil, + address_line2: nil, + town_or_city: nil, + postcode_full: nil) + end + + it "routes to the manual address questions" do + expect(address_lettings_log.manual_address_entry_selected).to eq(false) + expect(address_lettings_log.uprn_selection).to eq(nil) + expect(address_lettings_log.address_line1).to eq(nil) + expect(address_lettings_log.address_line2).to eq(nil) + expect(address_lettings_log.town_or_city).to eq(nil) + expect(address_lettings_log.postcode_full).to eq(nil) + + address_lettings_log.update!(rsnvac: 15) + expect(address_lettings_log.manual_address_entry_selected).to eq(true) + expect(address_lettings_log.uprn_selection).to eq(nil) + expect(address_lettings_log.uprn).to eq(nil) + expect(address_lettings_log.uprn_known).to eq(0) + end + end + end end describe "optional fields" do From 4c84261819120cd5b6907b8181520e5f8c9aa8d2 Mon Sep 17 00:00:00 2001 From: carolynbarker <8038496+carolynbarker@users.noreply.github.com> Date: Tue, 11 Mar 2025 11:52:46 +0000 Subject: [PATCH 05/31] CLDC-3802 sales BU factory traits (#2963) * add traits for completed test BU files * update tests --------- Co-authored-by: Carolyn --- .../form/sales/pages/previous_bedrooms.rb | 4 +++ .../sales/pages/previous_property_type.rb | 4 +++ .../form/sales/pages/previous_tenure.rb | 4 +++ spec/factories/sales_log.rb | 33 +++++++++++++++++++ .../sales/pages/previous_bedrooms_spec.rb | 4 +++ .../pages/previous_property_type_spec.rb | 4 +++ .../form/sales/pages/previous_tenure_spec.rb | 4 +++ 7 files changed, 57 insertions(+) diff --git a/app/models/form/sales/pages/previous_bedrooms.rb b/app/models/form/sales/pages/previous_bedrooms.rb index 214632d49..41573890d 100644 --- a/app/models/form/sales/pages/previous_bedrooms.rb +++ b/app/models/form/sales/pages/previous_bedrooms.rb @@ -9,6 +9,10 @@ class Form::Sales::Pages::PreviousBedrooms < ::Form::Page { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ] end diff --git a/app/models/form/sales/pages/previous_property_type.rb b/app/models/form/sales/pages/previous_property_type.rb index 26669d774..03a8a6384 100644 --- a/app/models/form/sales/pages/previous_property_type.rb +++ b/app/models/form/sales/pages/previous_property_type.rb @@ -11,6 +11,10 @@ class Form::Sales::Pages::PreviousPropertyType < ::Form::Page { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ] end diff --git a/app/models/form/sales/pages/previous_tenure.rb b/app/models/form/sales/pages/previous_tenure.rb index 0f4a4b250..7abdb1db5 100644 --- a/app/models/form/sales/pages/previous_tenure.rb +++ b/app/models/form/sales/pages/previous_tenure.rb @@ -12,6 +12,10 @@ class Form::Sales::Pages::PreviousTenure < ::Form::Page { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ] end diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index 64137704c..4c83fd04d 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -184,6 +184,39 @@ FactoryBot.define do end end end + trait :discounted_2025_completed do + completed + discount { 20 } + end + trait :shared_2025_completed do + completed + shared_ownership + staircase { 2 } + resale { 2 } + frombeds { 2 } + fromprop { 1 } + socprevten { 3 } + mrent { 900 } + equity { 30 } + ppostcode_full { "SW1A 1AA" } + hodate { Time.zone.today } + end + trait :staircasing_2025_completed do + completed + shared_ownership + staircase { 1 } + stairbought { 10 } + stairowned { 60 } + staircasesale { 2 } + firststair { 2 } + initialpurchase { Time.zone.today - 2.years } + numstair { 2 } + lasttransaction { Time.zone.today - 1.year } + mrentprestaircasing { 1000 } + mrent { 900 } + equity { 30 } + ppostcode_full { "SW1A 1AA" } + end trait :with_uprn do uprn { rand(999_999_999_999).to_s } uprn_known { 1 } diff --git a/spec/models/form/sales/pages/previous_bedrooms_spec.rb b/spec/models/form/sales/pages/previous_bedrooms_spec.rb index 1899b03bc..a9f9f9337 100644 --- a/spec/models/form/sales/pages/previous_bedrooms_spec.rb +++ b/spec/models/form/sales/pages/previous_bedrooms_spec.rb @@ -31,6 +31,10 @@ RSpec.describe Form::Sales::Pages::PreviousBedrooms, type: :model do { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ]) end end diff --git a/spec/models/form/sales/pages/previous_property_type_spec.rb b/spec/models/form/sales/pages/previous_property_type_spec.rb index 357e7dc2e..41a988ee7 100644 --- a/spec/models/form/sales/pages/previous_property_type_spec.rb +++ b/spec/models/form/sales/pages/previous_property_type_spec.rb @@ -31,6 +31,10 @@ RSpec.describe Form::Sales::Pages::PreviousPropertyType, type: :model do { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ]) end end diff --git a/spec/models/form/sales/pages/previous_tenure_spec.rb b/spec/models/form/sales/pages/previous_tenure_spec.rb index 1dc5ec772..b5e8956cc 100644 --- a/spec/models/form/sales/pages/previous_tenure_spec.rb +++ b/spec/models/form/sales/pages/previous_tenure_spec.rb @@ -31,6 +31,10 @@ RSpec.describe Form::Sales::Pages::PreviousTenure, type: :model do { "soctenant" => 0, }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevten" => 2 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 1 }, + { "soctenant_is_inferred?" => true, "ownershipsch" => 1, "prevtenbuy2" => 2 }, ]) end end From d3219b9ba3055c6c4ea4dcb87944570251790090 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:34:35 +0000 Subject: [PATCH 06/31] Add error handling for JSON parsing in UPRN client (#2989) * Add error handling for JSON parsing in UPRN client * Update error handling * Update error handling 2 --- app/services/uprn_client.rb | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/services/uprn_client.rb b/app/services/uprn_client.rb index 97dc4753f..f170ba3a0 100644 --- a/app/services/uprn_client.rb +++ b/app/services/uprn_client.rb @@ -20,7 +20,14 @@ class UprnClient end def result - @result ||= JSON.parse(response.body).dig("results", 0, "DPA") || JSON.parse(response.body).dig("results", 0, "LPI") + @result ||= if response.is_a?(Net::HTTPSuccess) + parsed_response = JSON.parse(response.body) + parsed_response.dig("results", 0, "DPA") || parsed_response.dig("results", 0, "LPI") + else + Rails.logger.error("Response code: #{response.code}") + Rails.logger.error("Response body: #{response.body}") + nil + end end private From 0dff6f2fa359af49c64422982788608c9c28b392 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:40:18 +0000 Subject: [PATCH 07/31] Skip bulk error (#2986) --- app/models/validations/sales/property_validations.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/validations/sales/property_validations.rb b/app/models/validations/sales/property_validations.rb index 7fd4d2440..56a09c36f 100644 --- a/app/models/validations/sales/property_validations.rb +++ b/app/models/validations/sales/property_validations.rb @@ -49,9 +49,9 @@ module Validations::Sales::PropertyValidations record.errors.add :uprn_confirmation, I18n.t("validations.sales.property_information.uprn_confirmation.not_in_england") record.errors.add :uprn_selection, I18n.t("validations.sales.property_information.uprn_selection.not_in_england") if record.uprn.present? - record.errors.add :saledate, I18n.t("validations.sales.property_information.saledate.address_not_in_england") + record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.property_information.saledate.address_not_in_england") else - record.errors.add :saledate, I18n.t("validations.sales.property_information.saledate.postcode_not_in_england") + record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.property_information.saledate.postcode_not_in_england") end end end From 772b1fcd68cc92d1472459bc01c11c5f3f25c604 Mon Sep 17 00:00:00 2001 From: carolynbarker <8038496+carolynbarker@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:02:27 +0000 Subject: [PATCH 08/31] CLDC-3911 Limit CSV variables to those defined in or before year (#2982) * don't use variables from the future * filter out nil elements for vars only defined in future * only group variables by name, not by description --------- Co-authored-by: Carolyn --- app/services/csv/lettings_log_csv_service.rb | 7 +++---- app/services/csv/sales_log_csv_service.rb | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/services/csv/lettings_log_csv_service.rb b/app/services/csv/lettings_log_csv_service.rb index 0a187d524..d7ab101ac 100644 --- a/app/services/csv/lettings_log_csv_service.rb +++ b/app/services/csv/lettings_log_csv_service.rb @@ -284,13 +284,12 @@ module Csv end def lettings_log_definitions - CsvVariableDefinition.lettings.group_by { |record| [record.variable, record.definition] } - .map do |_, options| + CsvVariableDefinition.lettings.group_by(&:variable).map { |_, options| exact_match = options.find { |definition| definition.year == @year } next exact_match if exact_match - options.max_by(&:year) - end + options.select { |opt| opt.year < @year }.max_by(&:year) + }.compact end def insert_derived_and_related_attributes(ordered_questions) diff --git a/app/services/csv/sales_log_csv_service.rb b/app/services/csv/sales_log_csv_service.rb index 08ce178e3..35adcf27f 100644 --- a/app/services/csv/sales_log_csv_service.rb +++ b/app/services/csv/sales_log_csv_service.rb @@ -179,13 +179,12 @@ module Csv end def sales_log_definitions - CsvVariableDefinition.sales.group_by { |record| [record.variable, record.definition] } - .map do |_, options| + CsvVariableDefinition.sales.group_by(&:variable).map { |_, options| exact_match = options.find { |definition| definition.year == @year } next exact_match if exact_match - options.max_by(&:year) - end + options.select { |opt| opt.year < @year }.max_by(&:year) + }.compact end def insert_derived_and_related_attributes(ordered_questions) From c14444a6fb57d204660cdf6d4f496ed050b211ee Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 13 Mar 2025 08:44:32 +0000 Subject: [PATCH 09/31] Switch responses order (#2990) --- app/models/form/lettings/questions/reason.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/form/lettings/questions/reason.rb b/app/models/form/lettings/questions/reason.rb index 4cf851f4a..d6254f8fa 100644 --- a/app/models/form/lettings/questions/reason.rb +++ b/app/models/form/lettings/questions/reason.rb @@ -46,9 +46,9 @@ class Form::Lettings::Questions::Reason < ::Form::Question "18" => { "value" => "To move to accommodation with support" }, "19" => { "value" => "To move to independent accommodation" }, "20" => { "value" => "Other" }, - "28" => { "value" => "Don’t know" }, - "divider" => { "value" => true }, "47" => { "value" => "Tenant prefers not to say" }, + "divider" => { "value" => true }, + "28" => { "value" => "Don’t know" }, }.freeze end From 1bc39f0ed1ffce0d11c89ed0122afbff4aa92422 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 13 Mar 2025 09:47:16 +0000 Subject: [PATCH 10/31] CLDC-3917: Sales BU numstair question range error message (#2984) * Calculate legend size of date question * Add numeric error message to numstair question --- app/services/bulk_upload/sales/year2025/row_parser.rb | 9 +++++++++ app/views/form/_date_question.html.erb | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index feb607baf..6a5e3014d 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/app/services/bulk_upload/sales/year2025/row_parser.rb @@ -393,6 +393,15 @@ class BulkUpload::Sales::Year2025::RowParser }, on: :after_log + validates :field_103, + numericality: { + greater_than_or_equal_to: 2, + less_than_or_equal_to: 10, + message: I18n.t("#{ERROR_BASE_KEY}.numeric.within_range", field: "Number of staircasing transactions", min: "2", max: "10"), + allow_blank: true, + }, + on: :before_log + validate :validate_buyer1_economic_status, on: :before_log validate :validate_buyer2_economic_status, on: :before_log validate :validate_valid_radio_option, on: :before_log diff --git a/app/views/form/_date_question.html.erb b/app/views/form/_date_question.html.erb index 55193b01a..a1df5f4d5 100644 --- a/app/views/form/_date_question.html.erb +++ b/app/views/form/_date_question.html.erb @@ -1,9 +1,10 @@ <%= render partial: "form/guidance/#{question.top_guidance_partial}" if question.top_guidance? %> +<% legend = legend(question, page_header, conditional) %> <%= render partial: "components/date_picker", locals: { resource: @log, question_id: question.id, - legend: { text: legend(question, page_header, conditional)[:text], size: "l", caption: caption(caption_text, page_header, conditional) }, + legend: { text: legend[:text], size: legend[:size], caption: caption(caption_text, page_header, conditional) }, resource_type: @log.log_type, hint: (question.hint_text.blank? ? "" : (question.hint_text.html_safe + "

".html_safe)) + "For example, #{date_mid_collection_year_formatted(@log.startdate).tr(' ', '/')}", f:, From d8f3541d4017d1c3b855c883f1aa299f598278cb Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 13 Mar 2025 11:30:58 +0000 Subject: [PATCH 11/31] Add error handling for json parsing to UPRN client (#2992) * Add error handling for JSON parsing in UPRN client * Update error handling * Update error handling 2 * Updates with sentry error reporting and test * Add rails logger message as well as sentry --- app/services/uprn_client.rb | 4 +++- spec/services/uprn_client_spec.rb | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/app/services/uprn_client.rb b/app/services/uprn_client.rb index f170ba3a0..f847c7da5 100644 --- a/app/services/uprn_client.rb +++ b/app/services/uprn_client.rb @@ -24,7 +24,9 @@ class UprnClient parsed_response = JSON.parse(response.body) parsed_response.dig("results", 0, "DPA") || parsed_response.dig("results", 0, "LPI") else - Rails.logger.error("Response code: #{response.code}") + @error = "UPRN client failed to return a valid result, try again later." + Sentry.capture_message("UPRN client failed to return a valid result with error code: #{response.code}.") + Rails.logger.error("UPRN client failed to return a valid result with error code: #{response.code}.") Rails.logger.error("Response body: #{response.body}") nil end diff --git a/spec/services/uprn_client_spec.rb b/spec/services/uprn_client_spec.rb index b10ab7376..8d5c45ed9 100644 --- a/spec/services/uprn_client_spec.rb +++ b/spec/services/uprn_client_spec.rb @@ -86,5 +86,33 @@ describe UprnClient do expect(client.error).to be_nil end end + + describe "result" do + context "when response is successful" do + before do + stub_api_request(body: valid_response) + + client.call + end + + it "returns parsed result" do + expect(client.result).to eq({ "postcode" => "12345" }) + expect(client.send(:response).code.to_i).to eq(200) + end + end + + context "when response is not successful" do + before do + stub_api_request(body: valid_response, status: 500) + + client.call + end + + it "returns nil" do + expect(client.result).to be_nil + expect(client.error).to eq("UPRN client failed to return a valid result, try again later.") + end + end + end end end From 5ac1291c65dd58560df94c9e901e7091fc0d5400 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:30:48 +0000 Subject: [PATCH 12/31] CLDC-3897 Re-export merged users (#2969) * Update values_updated_at for merged users * Export users when they have been manually updated --- app/services/exports/user_export_service.rb | 2 +- .../merge/merge_organisations_service.rb | 2 +- ...305092900_add_values_updated_at_to_user.rb | 5 +++++ db/schema.rb | 3 ++- .../exports/user_export_service_spec.rb | 21 ++++++++++++++++++- .../merge/merge_organisations_service_spec.rb | 2 ++ 6 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20250305092900_add_values_updated_at_to_user.rb diff --git a/app/services/exports/user_export_service.rb b/app/services/exports/user_export_service.rb index 707d13c14..177daee1d 100644 --- a/app/services/exports/user_export_service.rb +++ b/app/services/exports/user_export_service.rb @@ -28,7 +28,7 @@ module Exports def retrieve_resources(recent_export, full_update, _year) if !full_update && recent_export params = { from: recent_export.started_at, to: @start_time } - User.where("(updated_at >= :from AND updated_at <= :to)", params) + User.where("(updated_at >= :from AND updated_at <= :to) OR (values_updated_at IS NOT NULL AND values_updated_at >= :from AND values_updated_at <= :to)", params) else params = { to: @start_time } User.where("updated_at <= :to", params) diff --git a/app/services/merge/merge_organisations_service.rb b/app/services/merge/merge_organisations_service.rb index bcaad85a6..40749b54c 100644 --- a/app/services/merge/merge_organisations_service.rb +++ b/app/services/merge/merge_organisations_service.rb @@ -62,7 +62,7 @@ private def merge_users(merging_organisation) users_to_merge = users_to_merge(merging_organisation) @merged_users[merging_organisation.name] = users_to_merge.map { |user| { name: user.name, email: user.email } } - users_to_merge.update_all(organisation_id: @absorbing_organisation.id) + users_to_merge.update_all(organisation_id: @absorbing_organisation.id, values_updated_at: Time.zone.now) end def merge_schemes_and_locations(merging_organisation) diff --git a/db/migrate/20250305092900_add_values_updated_at_to_user.rb b/db/migrate/20250305092900_add_values_updated_at_to_user.rb new file mode 100644 index 000000000..8ebe67af4 --- /dev/null +++ b/db/migrate/20250305092900_add_values_updated_at_to_user.rb @@ -0,0 +1,5 @@ +class AddValuesUpdatedAtToUser < ActiveRecord::Migration[7.2] + def change + add_column :users, :values_updated_at, :datetime + end +end diff --git a/db/schema.rb b/db/schema.rb index 82d67b432..e29560461 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.2].define(version: 2025_02_25_180643) do +ActiveRecord::Schema[7.2].define(version: 2025_03_05_092900) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -853,6 +853,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_02_25_180643) do t.boolean "reactivate_with_organisation" t.datetime "discarded_at" t.string "phone_extension" + t.datetime "values_updated_at" t.index ["confirmation_token"], name: "index_users_on_confirmation_token", unique: true t.index ["email"], name: "index_users_on_email", unique: true t.index ["encrypted_otp_secret_key"], name: "index_users_on_encrypted_otp_secret_key", unique: true diff --git a/spec/services/exports/user_export_service_spec.rb b/spec/services/exports/user_export_service_spec.rb index 3f4ece76d..93ba124d9 100644 --- a/spec/services/exports/user_export_service_spec.rb +++ b/spec/services/exports/user_export_service_spec.rb @@ -202,7 +202,26 @@ RSpec.describe Exports::UserExportService do before do create(:user, updated_at: Time.zone.local(2022, 4, 27), organisation:) create(:user, updated_at: Time.zone.local(2022, 4, 27), organisation:) - Export.create!(started_at: Time.zone.local(2022, 4, 26), base_number: 1, increment_number: 1) + Export.create!(started_at: Time.zone.local(2022, 4, 26), base_number: 1, increment_number: 1, empty_export: true, collection: "users") + end + + it "generates an XML manifest file with the expected content within the ZIP file" do + expected_content = replace_record_number(local_manifest_file.read, 2) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_manifest_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + expect(export_service.export_xml_users).to eq({ expected_zip_filename.gsub(".zip", "") => start_time }) + end + end + + context "and a user has been manually updated since the previous partial export" do + before do + create(:user, updated_at: Time.zone.local(2022, 4, 25), values_updated_at: Time.zone.local(2022, 4, 27), organisation:) + create(:user, updated_at: Time.zone.local(2022, 4, 25), values_updated_at: Time.zone.local(2022, 4, 27), organisation:) + Export.create!(started_at: Time.zone.local(2022, 4, 26), base_number: 1, increment_number: 1, empty_export: true, collection: "users") end it "generates an XML manifest file with the expected content within the ZIP file" do diff --git a/spec/services/merge/merge_organisations_service_spec.rb b/spec/services/merge/merge_organisations_service_spec.rb index f20e16a16..9355a757a 100644 --- a/spec/services/merge/merge_organisations_service_spec.rb +++ b/spec/services/merge/merge_organisations_service_spec.rb @@ -31,10 +31,12 @@ RSpec.describe Merge::MergeOrganisationsService do expect(Rails.logger).to receive(:info).with("\t#{merging_organisation.data_protection_officers.first.name} (#{merging_organisation.data_protection_officers.first.email})") expect(Rails.logger).to receive(:info).with("\tfake name (fake@email.com)") expect(Rails.logger).to receive(:info).with("New schemes from fake org:") + expect(merging_organisation_user.values_updated_at).to be_nil merge_organisations_service.call merging_organisation_user.reload expect(merging_organisation_user.organisation).to eq(absorbing_organisation) + expect(merging_organisation_user.values_updated_at).not_to be_nil end it "sets merge date on merged organisation" do From 7d734c7a1a3e7d46f057dcf43d7875a001d3efe5 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:33:55 +0000 Subject: [PATCH 13/31] Add missing mappping for lettype and renttype (#2978) --- app/services/csv/lettings_log_csv_service.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/services/csv/lettings_log_csv_service.rb b/app/services/csv/lettings_log_csv_service.rb index d7ab101ac..2da392fb0 100644 --- a/app/services/csv/lettings_log_csv_service.rb +++ b/app/services/csv/lettings_log_csv_service.rb @@ -177,6 +177,10 @@ module Csv 10 => "Intermediate rent supported housing private registered provider", 11 => "Intermediate rent general needs local authority", 12 => "Intermediate rent supported housing local authority", + 13 => "Specified accommodation general needs private registered provider", + 14 => "Specified accommodation supported housing private registered provider", + 15 => "Specified accommodation general needs local authority", + 16 => "Specified accommodation supported housing local authority", }.freeze IRPRODUCT_LABELS = { @@ -206,6 +210,7 @@ module Csv 1 => "Social Rent", 2 => "Affordable Rent", 3 => "Intermediate Rent", + 4 => "Specified accommodation", }.freeze UPRN_KNOWN_LABELS = { From b327d6725a8bf30afde5c00c36223b43e491907e Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:19:45 +0000 Subject: [PATCH 14/31] CLDC-3910: BU Sales - Staircasing initial equity do not block log creation (#2985) * Skip bu error on the setup question type * Lint * Skip bu error on setup question type for equity calculations * Skip bu error on setup question type for mrent validations * Skip bu error on setup question type for stairbought validations --- app/models/validations/sales/financial_validations.rb | 6 +++--- .../validations/sales/sale_information_validations.rb | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/models/validations/sales/financial_validations.rb b/app/models/validations/sales/financial_validations.rb index e5d8232f0..ae98184c9 100644 --- a/app/models/validations/sales/financial_validations.rb +++ b/app/models/validations/sales/financial_validations.rb @@ -75,7 +75,7 @@ module Validations::Sales::FinancialValidations if threshold && record.stairbought < threshold shared_ownership_type = record.form.get_question("type", record).label_from_value(record.type).downcase record.errors.add :stairbought, I18n.t("validations.sales.financial.stairbought.percentage_bought_must_be_at_least_threshold", threshold:, shared_ownership_type:) - record.errors.add :type, I18n.t("validations.sales.financial.type.percentage_bought_must_be_at_least_threshold", threshold:, shared_ownership_type:) + record.errors.add :type, :skip_bu_error, message: I18n.t("validations.sales.financial.type.percentage_bought_must_be_at_least_threshold", threshold:, shared_ownership_type:) end end @@ -96,10 +96,10 @@ module Validations::Sales::FinancialValidations return unless (range = ranges[record.type]) if record.equity < range.min - record.errors.add :type, I18n.t("validations.sales.financial.type.equity_under_min", min_equity: range.min) + record.errors.add :type, :skip_bu_error, message: I18n.t("validations.sales.financial.type.equity_under_min", min_equity: range.min) record.errors.add :equity, :under_min, message: I18n.t("validations.sales.financial.equity.equity_under_min", min_equity: range.min) elsif !record.is_resale? && record.equity > range.max - record.errors.add :type, I18n.t("validations.sales.financial.type.equity_over_max", max_equity: range.max) + record.errors.add :type, :skip_bu_error, message: I18n.t("validations.sales.financial.type.equity_over_max", max_equity: range.max) record.errors.add :equity, :over_max, message: I18n.t("validations.sales.financial.equity.equity_over_max", max_equity: range.max) record.errors.add :resale, I18n.t("validations.sales.financial.resale.equity_over_max", max_equity: range.max) end diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index f99f6668a..3ddecaedb 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -108,7 +108,7 @@ module Validations::Sales::SaleInformationValidations if record.shared_ownership_scheme? && !record.old_persons_shared_ownership? && record.mrent > 9999 record.errors.add :mrent, I18n.t("validations.sales.sale_information.mrent.monthly_rent_higher_than_expected") - record.errors.add :type, I18n.t("validations.sales.sale_information.type.monthly_rent_higher_than_expected") + record.errors.add :type, :skip_bu_error, message: I18n.t("validations.sales.sale_information.type.monthly_rent_higher_than_expected") end end @@ -136,7 +136,7 @@ module Validations::Sales::SaleInformationValidations if max_stairbought && record.stairbought > max_stairbought record.errors.add :stairbought, I18n.t("validations.sales.sale_information.stairbought.stairbought_over_max", max_stairbought:, type: record.form.get_question("type", record).answer_label(record)) - record.errors.add :type, I18n.t("validations.sales.sale_information.type.stairbought_over_max", max_stairbought:, type: record.form.get_question("type", record).answer_label(record)) + record.errors.add :type, :skip_bu_error, message: I18n.t("validations.sales.sale_information.type.stairbought_over_max", max_stairbought:, type: record.form.get_question("type", record).answer_label(record)) end end From a5c54383f1866b24f8bb671dc695f69fe433ef10 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:20:28 +0000 Subject: [PATCH 15/31] CLDC-3924: Lettings household rent charge Qs with new rent period not shown (#2991) * Add new rent period that should show rent charge questions * Add new rent period to num weeks constant * Lint --- app/models/lettings_log.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 47ca80705..4554b99d2 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -148,7 +148,7 @@ class LettingsLog < Log OPTIONAL_FIELDS = %w[tenancycode propcode chcharge].freeze RENT_TYPE_MAPPING_LABELS = { 1 => "Social Rent", 2 => "Affordable Rent", 3 => "Intermediate Rent", 4 => "Specified accommodation" }.freeze HAS_BENEFITS_OPTIONS = [1, 6, 8, 7].freeze - NUM_OF_WEEKS_FROM_PERIOD = { 2 => 26, 3 => 13, 4 => 12, 5 => 50, 6 => 49, 7 => 48, 8 => 47, 9 => 46, 1 => 52, 10 => 53 }.freeze + NUM_OF_WEEKS_FROM_PERIOD = { 2 => 26, 3 => 13, 4 => 12, 5 => 50, 6 => 49, 7 => 48, 8 => 47, 9 => 46, 11 => 51, 1 => 52, 10 => 53 }.freeze SUFFIX_FROM_PERIOD = { 2 => "every 2 weeks", 3 => "every 4 weeks", 4 => "every month" }.freeze DUPLICATE_LOG_ATTRIBUTES = %w[owning_organisation_id tenancycode startdate age1_known age1 sex1 ecstat1 tcharge household_charge chcharge].freeze RENT_TYPE = { @@ -626,7 +626,7 @@ class LettingsLog < Log end def rent_and_charges_paid_weekly? - [1, 5, 6, 7, 8, 9, 10].include? period + [1, 5, 6, 7, 8, 9, 10, 11].include? period end def rent_and_charges_paid_every_4_weeks? From 61d412577ca64fb21ef91835852dd4067abb7396 Mon Sep 17 00:00:00 2001 From: carolynbarker <8038496+carolynbarker@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:07:53 +0000 Subject: [PATCH 16/31] CLDC-3904 remove default from relat mapping (#2993) * remove default from relat mapping * update valid test data * fix field number * add validation messge for other values --------- Co-authored-by: Carolyn --- .../bulk_upload/sales/year2025/row_parser.rb | 52 ++++++++++--------- .../sales/year2025/row_parser_spec.rb | 48 ++++++++++++++++- 2 files changed, 74 insertions(+), 26 deletions(-) diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index 6a5e3014d..0de492e6f 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/app/services/bulk_upload/sales/year2025/row_parser.rb @@ -815,31 +815,11 @@ private attributes["sex5"] = field_52 attributes["sex6"] = field_56 - attributes["relat2"] = if field_34 == 1 - "P" - else - (field_34 == 2 ? "X" : "R") - end - attributes["relat3"] = if field_42 == 1 - "P" - else - (field_42 == 2 ? "X" : "R") - end - attributes["relat4"] = if field_46 == 1 - "P" - else - (field_46 == 2 ? "X" : "R") - end - attributes["relat5"] = if field_50 == 1 - "P" - else - (field_50 == 2 ? "X" : "R") - end - attributes["relat6"] = if field_54 == 1 - "P" - else - (field_54 == 2 ? "X" : "R") - end + attributes["relat2"] = relationship_from_is_partner(field_34) + attributes["relat3"] = relationship_from_is_partner(field_42) + attributes["relat4"] = relationship_from_is_partner(field_46) + attributes["relat5"] = relationship_from_is_partner(field_50) + attributes["relat6"] = relationship_from_is_partner(field_54) attributes["ecstat1"] = field_32 attributes["ecstat2"] = field_39 @@ -1052,6 +1032,17 @@ private field_55.present? || field_56.present? || field_54.present? end + def relationship_from_is_partner(is_partner) + case is_partner + when 1 + "P" + when 2 + "X" + when 3 + "R" + end + end + def details_known?(person_n) send("person_#{person_n}_present?") ? 1 : 2 end @@ -1491,6 +1482,17 @@ private %w[0] + GlobalConstants::COUNTRIES_ANSWER_OPTIONS.keys # 0 is "Prefers not to say" end + def validate_relat_fields + %i[field_34 field_42 field_46 field_50 field_54].each do |field| + value = send(field) + next if value.blank? + + unless (1..3).cover?(value) + errors.add(field, I18n.t("#{ERROR_BASE_KEY}.invalid_option", question: format_ending(QUESTIONS[field]))) + end + end + end + def bulk_upload_organisation Organisation.find(bulk_upload.organisation_id) end diff --git a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb index 28aac4fea..0074b3712 100644 --- a/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2025/row_parser_spec.rb @@ -60,7 +60,7 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do field_31: "28", field_32: "1", field_33: "1", - field_34: "R", + field_34: "3", field_35: "32", field_36: "F", field_37: "17", @@ -1145,6 +1145,52 @@ RSpec.describe BulkUpload::Sales::Year2025::RowParser do end end + describe "relationship field mappings" do + [ + %w[field_34 relat2 2], + %w[field_42 relat3 3], + %w[field_46 relat4 4], + %w[field_50 relat5 5], + %w[field_54 relat6 6], + ].each do |input_field, relationship_attribute, person_num| + describe input_field.to_s do + context "when #{input_field} is 1" do + let(:attributes) { setup_section_params.merge({ input_field.to_sym => "1", field_41: "5" }) } + + it "sets relationship to P" do + expect(parser.log.public_send(relationship_attribute)).to eq("P") + end + end + + context "when #{input_field} is 2" do + let(:attributes) { setup_section_params.merge({ input_field.to_sym => "2", field_41: "5" }) } + + it "sets relationship to X" do + expect(parser.log.public_send(relationship_attribute)).to eq("X") + end + end + + context "when #{input_field} is 3" do + let(:attributes) { setup_section_params.merge({ input_field.to_sym => "3", field_41: "5" }) } + + it "sets relationship to R" do + expect(parser.log.public_send(relationship_attribute)).to eq("R") + end + end + + context "when #{input_field} is 4" do + let(:attributes) { setup_section_params.merge({ input_field.to_sym => "4", field_41: "5" }) } + + it "gives a validation error" do + parser.valid? + validation_message = "You must answer person #{person_num} is the partner of buyer 1." + expect(parser.errors[input_field]).to include validation_message + end + end + end + end + end + describe "field_39" do # ecstat2 context "when buyer 2 has no age but has ecstat as child" do let(:attributes) { valid_attributes.merge({ field_35: nil, field_39: "9" }) } From 3068ceb5fb8db01df1b94e8814efb6937889aa91 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:11:00 +0000 Subject: [PATCH 17/31] Test 2025 lettings exports (#3000) --- .../lettings_log_csv_export_codes_25.csv | 3 + .../lettings_log_csv_export_labels_25.csv | 3 + ...gs_log_csv_export_non_support_codes_25.csv | 3 + ...s_log_csv_export_non_support_labels_25.csv | 3 + .../csv/lettings_log_csv_service_spec.rb | 193 ++++++++++++++++++ 5 files changed, 205 insertions(+) create mode 100644 spec/fixtures/files/lettings_log_csv_export_codes_25.csv create mode 100644 spec/fixtures/files/lettings_log_csv_export_labels_25.csv create mode 100644 spec/fixtures/files/lettings_log_csv_export_non_support_codes_25.csv create mode 100644 spec/fixtures/files/lettings_log_csv_export_non_support_labels_25.csv diff --git a/spec/fixtures/files/lettings_log_csv_export_codes_25.csv b/spec/fixtures/files/lettings_log_csv_export_codes_25.csv new file mode 100644 index 000000000..8ef206ca0 --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_codes_25.csv @@ -0,0 +1,3 @@ +Log ID,Status of log,ID of a set of duplicate logs,User the log is created by,User the log is assigned to,Is the user in the assigned_to column the data protection officer?,Time and date the log was created,User who last updated the log,Time and date the log was last updated,Was the log submitted in-service or via bulk upload?,Year collection period opened,ID of a set of bulk uploaded logs,Which organisation owns this property?,Which organisation manages this letting?,What is the needs type?,What is the letting type?,Is this letting a renewal?,What is the tenancy start date?,"What is the rent type? (grouped into SR, IR or AR)",What is the rent type?,Which type of Intermediate Rent is this letting?,Which 'Other' type of Intermediate Rent is this letting?,Is this a London Affordable Rent letting?,What is the tenant code?,What is the property reference?,Has the tenant seen the MHCLG privacy notice?,Is this the first time the property has been let as social housing?,What rent product was the property most recently let as?,What is the reason for the property being vacant?,Is this property new to the social rented sector?,"If known, property's UPRN",Address line 1,Address line 2,Town or City,County,Postcode,The internal value to indicate if the LA was inferred from the postcode,What is the property's local authority?,Local authority code,Is the UPRN known?,UPRN of the address selected,Was the 'No address found' page seen?,Address line 1 input from address matching feature,Postcode input from address matching feature,Address line 1 entered in bulk upload file,Address line 2 entered in bulk upload file,Town or city entered in bulk upload file,County entered in bulk upload file,Postcode entered in bulk upload file,Local authority entered in bulk upload file,What type of unit is the property?,Which type of building is the property?,Is the property built or adapted to wheelchair-user standards?,How many bedrooms does the property have?,What is the void date?,Number of days the property was vacant,The following soft validation was confirmed: You told us that the property has been vacant for more than 2 years. This is higher than we would expect.,Were any major repairs carried out during the void period?,What date were any major repairs completed on?,The following soft validation was confirmed: You told us the property has been vacant for 2 years. This is higher than we would expect.,Is this letting in sheltered accommodation?,Is this a joint tenancy?,Is this a starter tenancy?,What is the type of tenancy?,"If 'Other', what is the type of tenancy?",What is the length of the fixed-term tenancy to the nearest year?,How many people live in the household at this letting?,The following soft validation was confirmed: You told us somebody in the household is pregnant. You also told us there are no female tenants living at the property.,"Where household characteristics have a 'Refused' option for some or all of: AGE1-AGE8, SEX1-SEX8, RELAT2-RELAT8, ECSTAT1-ECSTAT8","Type of household 1 = 1 elder; 2 = 2 adults, including elder(s); 3 = 1 adult; 4 = 2 adults; 5 = 1 adult & 1+ children; 6 = 2+ adults & 1+ children; 9 = Other",Total number of dependent children in the household (Sum of when RELAT2-8 = C),Total number of elders in household (Sum of when AGE1-8 >= 60),Total number of adults in household,What is the lead tenant's age?,The following soft validation was confirmed: You told us this person is aged %{age} years and retired. The minimum expected retirement age for %{gender} in England is %{age}.,Which of these best describes the lead tenant's gender identity?,What is the lead tenant's ethnic group?,Which of these best describes the lead tenant's ethnic background?,What is the lead tenant's nationality?,Which of these best describes the lead tenant's working situation?,Are the details of tenant 2 known?,What is person 2's relationship to the lead tenant?,"The following soft validation was confirmed: You said that [person X]'s relationship to lead tenant is partner, and that their age is [AGEX]. Are you sure this is correct?",The following soft validation was confirmed: You said that more than one person in the household is the partner of the lead tenant. Are you sure this is correct?,What is person 2's age?,Which of these best describes person 2's gender identity?,Which of these best describes person 2's working situation?,Are the details of tenant 3 known?,What is person 3's relationship to the lead tenant?,What is person 3's age?,Which of these best describes person 3's gender identity?,Which of these best describes person 3's working situation?,Are the details of tenant 4 known?,What is person 4's relationship to the lead tenant?,What is person 4's age?,Which of these best describes person 4's gender identity?,Which of these best describes person 4's working situation?,Are the details of tenant 5 known?,What is person 5's relationship to the lead tenant?,What is person 5's age?,Which of these best describes person 5's gender identity?,Which of these best describes person 5's working situation?,Are the details of tenant 6 known?,What is person 6's relationship to the lead tenant?,What is person 6's age?,Which of these best describes person 6's gender identity?,Which of these best describes person 6's working situation?,Are the details of tenant 7 known?,What is person 7's relationship to the lead tenant?,What is person 7's age?,Which of these best describes person 7's gender identity?,Which of these best describes person 7's working situation?,Are the details of tenant 8 known?,What is person 8's relationship to the lead tenant?,What is person 8's age?,Which of these best describes person 8's gender identity?,Which of these best describes person 8's working situation?,Does anybody in the household have links to the UK armed forces?,Is this person still serving in the UK armed forces?,Was this person seriously injured or ill as a result of serving in the UK armed forces?,Is anybody in the household pregnant?,Does anybody in the household have any disabled access needs?,"What access needs do they have? (Fully wheelchair-accessible housing, Level access housing or Wheelchair access to essential rooms)",Disabled access needs a) Fully wheelchair-accessible housing,Disabled access needs b) Wheelchair access to essential rooms,Disabled access needs c) Level access housing,Disabled access needs f) Other disabled access needs,Disabled access needs g) No disabled access needs,Disabled access needs h) Don't know,Do they have any other disabled access needs?,Does anybody in the household have a physical or mental health condition (or other illness) expected to last 12 months or more?,Does this person's condition affect their dexterity?,Does this person's condition affect their learning or understanding or concentrating?,Does this person's condition affect their hearing?,Does this person's condition affect their memory?,Does this person's condition affect their mental health?,Does this person's condition affect their mobility?,Does this person's condition affect them socially or behaviourally?,Does this person's condition affect their stamina or breathing or fatigue?,Does this person's condition affect their vision?,Does this person's condition affect them in another way?,How long has the household continuously lived in the local authority area of the new letting?,How long has the household been on the local authority waiting list for the new letting?,What is the tenant's main reason for the household leaving their last settled home?,"If 'Other', what was the main reason for leaving their last settled home?",The soft validation was confirmed,Where was the household immediately before this letting?,Did the household experience homelessness immediately before this letting?,Previous postcode unknown or previous accommodation was temporary,What is the postcode of the household's last settled home?,Was the local authority of the household's last settled home known?,The internal value to indicate if the previous LA was inferred from the postcode,Previous location LA name,Previous location's ONS LA Code,Was the household given reasonable preference by the local authority?,Reasonable preference reason - They were homeless or about to lose their home (within 56 days),"Reasonable preference reason - They were living in insanitary, overcrowded or unisatisfactory housing",Reasonable preference reason - They needed to move on medical and welfare reasons (including disability),Reasonable preference reason - They needed to move to avoid hardship to themselves or others,Reasonable preference reason - Don't Know,Was the letting made under Choice-Based Lettings (CBL)?,Was the letting made under the Common Allocation Policy (CAP)?,Was the letting made under the Common Housing Register (CHR)?,Was the letting made under the Accessible Register?,"The letting was not allocated under CBL, CAP, CHR or Accessible Register.",,What was the source of referral for this letting?,"The following soft validation was confirmed: Are you sure? This is a general needs log, and this referral type is for supported housing.",Do you know the household's combined income after tax?,Was the household income refused?,How often does the household receive income?,How much income does the household have in total?,Populated when someone hits the soft validation and confirmed in the service,Is the tenant likely to be receiving any of these housing-related benefits?,"Does the tenant receive housing-related benefits? Yes if hb = Universal Credit housing element or Housing benefit, No if hb = Don't Know, Neither, Tenant prefers not to say or blank","How much of the household's income is from Universal Credit, state pensions or benefits?",Does the household pay rent or other charges for the accommodation?,Does the household pay rent or other charges for the accommodation? - flag for when household_charge is answered no,How often does the household pay rent and other charges?,What is the basic rent?,Weekly rent,Populated when the soft validation and confirmed in the service,What is the service charge?,Weekly service charge,What is the personal service charge?,Weekly personal service charge,What is the support charge?,Weekly support charge,Total charge to the tenant,Weekly total charge to the tenant,Populated when the soft validation and confirmed in the service,Populated when the soft validation and confirmed in the service,Populated when the soft validation and confirmed in the service,"After the household has received any housing-related benefits, will they still need to pay for rent and charges?",Can you estimate the outstanding amount?,Estimated outstanding amount,Weekly total rent shortfall charge for tenant receiving housing benefit,What scheme does this letting belong to?,"From scheme code, we map to the scheme name",Does the scheme contain confidential information?,"What is this type of scheme? (Direct access hostel), Foyer, Housing for older people or Other supported housing",Is this scheme registered under the Care Standards Act 2000?,Which organisation owns the housing stock for this scheme?,What client group is this scheme intended for?,Does this scheme provide for another client group?,What is the other client group?,What support does this scheme provide?,Intended length of stay,Date scheme was created,Which location is this letting for?,What is the postcode for this location?,What is the name of this location?,How many units are at this location?,What is the most common type of unit at this location?,What are the mobility standards for the majority of the units in this location?,What is the local authority of this postcode?,When did the first property in this location become available under this scheme? +id,status,duplicate_set_id,created_by,assigned_to,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,bulk_upload_id,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,uprn,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,uprn_known,uprn_selection,address_search_value_check,address_line1_input,postcode_full_input,address_line1_as_entered,address_line2_as_entered,town_or_city_as_entered,county_as_entered,postcode_full_as_entered,la_as_entered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,sheltered,joint,startertenancy,tenancy,tenancyother,tenancylength,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,nationality_all,ecstat1,details_known_2,relat2,partner_under_16_value_check,multiple_partners_value_check,age2,sex2,ecstat2,details_known_3,relat3,age3,sex3,ecstat3,details_known_4,relat4,age4,sex4,ecstat4,details_known_5,relat5,age5,sex5,ecstat5,details_known_6,relat6,age6,sex6,ecstat6,details_known_7,relat7,age7,sex7,ecstat7,details_known_8,relat8,age8,sex8,ecstat8,armedforces,leftreg,reservist,preg_occ,housingneeds,housingneeds_type,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_f,housingneeds_g,housingneeds_h,housingneeds_other,illness,illness_type_4,illness_type_5,illness_type_2,illness_type_6,illness_type_7,illness_type_3,illness_type_9,illness_type_8,illness_type_1,illness_type_10,layear,waityear,reason,reasonother,reasonother_value_check,prevten,homeless,ppcodenk,ppostcode_full,previous_la_known,is_previous_la_inferred,prevloc_label,prevloc,reasonpref,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,cbl,cap,chr,accessible_register,letting_allocation_none,referral_type,referral,referral_value_check,net_income_known,incref,incfreq,earnings,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,brent,wrent,rent_value_check,scharge,wscharge,pscharge,wpschrge,supcharg,wsupchrg,tcharge,wtcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall_known,tshortfall,wtshortfall,scheme_code,scheme_service_name,scheme_confidential,SCHTYPE,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_local_authority,location_startdate +,in_progress,,s.port@jeemayle.com,s.port@jeemayle.com,false,2025-04-01T00:00:00+01:00,,2025-04-01T00:00:00+01:00,1,2025,,MHCLG,MHCLG,1,7,0,2025-04-01,2,2,,,2,HIJKLMN,ABCDEFG,1,0,2,6,2,,Address line 1,,London,,NW9 5LL,false,Barnet,E09000003,0,,,,,address line 1 as entered,address line 2 as entered,town or city as entered,county as entered,AB1 2CD,la as entered,7,1,1,3,2025-03-30,1,,1,2025-03-31,,,3,1,4,,2,4,,1,4,0,0,2,35,,F,0,2,36,0,0,P,,,32,M,6,1,R,-9,R,10,0,R,-9,R,10,,,,,,,,,,,,,,,,,,,,,1,4,1,2,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,2,7,4,,,6,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,0,0,,,,0,0,1,268,,6,1,1,,0,2,200.0,100.0,,50.0,25.0,40.0,20.0,35.0,17.5,325.0,162.5,,,,1,0,12.0,6.0,,,,,,,,,,,,,,,,,,,, diff --git a/spec/fixtures/files/lettings_log_csv_export_labels_25.csv b/spec/fixtures/files/lettings_log_csv_export_labels_25.csv new file mode 100644 index 000000000..f5390d27f --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_labels_25.csv @@ -0,0 +1,3 @@ +Log ID,Status of log,ID of a set of duplicate logs,User the log is created by,User the log is assigned to,Is the user in the assigned_to column the data protection officer?,Time and date the log was created,User who last updated the log,Time and date the log was last updated,Was the log submitted in-service or via bulk upload?,Year collection period opened,ID of a set of bulk uploaded logs,Which organisation owns this property?,Which organisation manages this letting?,What is the needs type?,What is the letting type?,Is this letting a renewal?,What is the tenancy start date?,"What is the rent type? (grouped into SR, IR or AR)",What is the rent type?,Which type of Intermediate Rent is this letting?,Which 'Other' type of Intermediate Rent is this letting?,Is this a London Affordable Rent letting?,What is the tenant code?,What is the property reference?,Has the tenant seen the MHCLG privacy notice?,Is this the first time the property has been let as social housing?,What rent product was the property most recently let as?,What is the reason for the property being vacant?,Is this property new to the social rented sector?,"If known, property's UPRN",Address line 1,Address line 2,Town or City,County,Postcode,The internal value to indicate if the LA was inferred from the postcode,What is the property's local authority?,Local authority code,Is the UPRN known?,UPRN of the address selected,Was the 'No address found' page seen?,Address line 1 input from address matching feature,Postcode input from address matching feature,Address line 1 entered in bulk upload file,Address line 2 entered in bulk upload file,Town or city entered in bulk upload file,County entered in bulk upload file,Postcode entered in bulk upload file,Local authority entered in bulk upload file,What type of unit is the property?,Which type of building is the property?,Is the property built or adapted to wheelchair-user standards?,How many bedrooms does the property have?,What is the void date?,Number of days the property was vacant,The following soft validation was confirmed: You told us that the property has been vacant for more than 2 years. This is higher than we would expect.,Were any major repairs carried out during the void period?,What date were any major repairs completed on?,The following soft validation was confirmed: You told us the property has been vacant for 2 years. This is higher than we would expect.,Is this letting in sheltered accommodation?,Is this a joint tenancy?,Is this a starter tenancy?,What is the type of tenancy?,"If 'Other', what is the type of tenancy?",What is the length of the fixed-term tenancy to the nearest year?,How many people live in the household at this letting?,The following soft validation was confirmed: You told us somebody in the household is pregnant. You also told us there are no female tenants living at the property.,"Where household characteristics have a 'Refused' option for some or all of: AGE1-AGE8, SEX1-SEX8, RELAT2-RELAT8, ECSTAT1-ECSTAT8","Type of household 1 = 1 elder; 2 = 2 adults, including elder(s); 3 = 1 adult; 4 = 2 adults; 5 = 1 adult & 1+ children; 6 = 2+ adults & 1+ children; 9 = Other",Total number of dependent children in the household (Sum of when RELAT2-8 = C),Total number of elders in household (Sum of when AGE1-8 >= 60),Total number of adults in household,What is the lead tenant's age?,The following soft validation was confirmed: You told us this person is aged %{age} years and retired. The minimum expected retirement age for %{gender} in England is %{age}.,Which of these best describes the lead tenant's gender identity?,What is the lead tenant's ethnic group?,Which of these best describes the lead tenant's ethnic background?,What is the lead tenant's nationality?,Which of these best describes the lead tenant's working situation?,Are the details of tenant 2 known?,What is person 2's relationship to the lead tenant?,"The following soft validation was confirmed: You said that [person X]'s relationship to lead tenant is partner, and that their age is [AGEX]. Are you sure this is correct?",The following soft validation was confirmed: You said that more than one person in the household is the partner of the lead tenant. Are you sure this is correct?,What is person 2's age?,Which of these best describes person 2's gender identity?,Which of these best describes person 2's working situation?,Are the details of tenant 3 known?,What is person 3's relationship to the lead tenant?,What is person 3's age?,Which of these best describes person 3's gender identity?,Which of these best describes person 3's working situation?,Are the details of tenant 4 known?,What is person 4's relationship to the lead tenant?,What is person 4's age?,Which of these best describes person 4's gender identity?,Which of these best describes person 4's working situation?,Are the details of tenant 5 known?,What is person 5's relationship to the lead tenant?,What is person 5's age?,Which of these best describes person 5's gender identity?,Which of these best describes person 5's working situation?,Are the details of tenant 6 known?,What is person 6's relationship to the lead tenant?,What is person 6's age?,Which of these best describes person 6's gender identity?,Which of these best describes person 6's working situation?,Are the details of tenant 7 known?,What is person 7's relationship to the lead tenant?,What is person 7's age?,Which of these best describes person 7's gender identity?,Which of these best describes person 7's working situation?,Are the details of tenant 8 known?,What is person 8's relationship to the lead tenant?,What is person 8's age?,Which of these best describes person 8's gender identity?,Which of these best describes person 8's working situation?,Does anybody in the household have links to the UK armed forces?,Is this person still serving in the UK armed forces?,Was this person seriously injured or ill as a result of serving in the UK armed forces?,Is anybody in the household pregnant?,Does anybody in the household have any disabled access needs?,"What access needs do they have? (Fully wheelchair-accessible housing, Level access housing or Wheelchair access to essential rooms)",Disabled access needs a) Fully wheelchair-accessible housing,Disabled access needs b) Wheelchair access to essential rooms,Disabled access needs c) Level access housing,Disabled access needs f) Other disabled access needs,Disabled access needs g) No disabled access needs,Disabled access needs h) Don't know,Do they have any other disabled access needs?,Does anybody in the household have a physical or mental health condition (or other illness) expected to last 12 months or more?,Does this person's condition affect their dexterity?,Does this person's condition affect their learning or understanding or concentrating?,Does this person's condition affect their hearing?,Does this person's condition affect their memory?,Does this person's condition affect their mental health?,Does this person's condition affect their mobility?,Does this person's condition affect them socially or behaviourally?,Does this person's condition affect their stamina or breathing or fatigue?,Does this person's condition affect their vision?,Does this person's condition affect them in another way?,How long has the household continuously lived in the local authority area of the new letting?,How long has the household been on the local authority waiting list for the new letting?,What is the tenant's main reason for the household leaving their last settled home?,"If 'Other', what was the main reason for leaving their last settled home?",The soft validation was confirmed,Where was the household immediately before this letting?,Did the household experience homelessness immediately before this letting?,Previous postcode unknown or previous accommodation was temporary,What is the postcode of the household's last settled home?,Was the local authority of the household's last settled home known?,The internal value to indicate if the previous LA was inferred from the postcode,Previous location LA name,Previous location's ONS LA Code,Was the household given reasonable preference by the local authority?,Reasonable preference reason - They were homeless or about to lose their home (within 56 days),"Reasonable preference reason - They were living in insanitary, overcrowded or unisatisfactory housing",Reasonable preference reason - They needed to move on medical and welfare reasons (including disability),Reasonable preference reason - They needed to move to avoid hardship to themselves or others,Reasonable preference reason - Don't Know,Was the letting made under Choice-Based Lettings (CBL)?,Was the letting made under the Common Allocation Policy (CAP)?,Was the letting made under the Common Housing Register (CHR)?,Was the letting made under the Accessible Register?,"The letting was not allocated under CBL, CAP, CHR or Accessible Register.",,What was the source of referral for this letting?,"The following soft validation was confirmed: Are you sure? This is a general needs log, and this referral type is for supported housing.",Do you know the household's combined income after tax?,Was the household income refused?,How often does the household receive income?,How much income does the household have in total?,Populated when someone hits the soft validation and confirmed in the service,Is the tenant likely to be receiving any of these housing-related benefits?,"Does the tenant receive housing-related benefits? Yes if hb = Universal Credit housing element or Housing benefit, No if hb = Don't Know, Neither, Tenant prefers not to say or blank","How much of the household's income is from Universal Credit, state pensions or benefits?",Does the household pay rent or other charges for the accommodation?,Does the household pay rent or other charges for the accommodation? - flag for when household_charge is answered no,How often does the household pay rent and other charges?,What is the basic rent?,Weekly rent,Populated when the soft validation and confirmed in the service,What is the service charge?,Weekly service charge,What is the personal service charge?,Weekly personal service charge,What is the support charge?,Weekly support charge,Total charge to the tenant,Weekly total charge to the tenant,Populated when the soft validation and confirmed in the service,Populated when the soft validation and confirmed in the service,Populated when the soft validation and confirmed in the service,"After the household has received any housing-related benefits, will they still need to pay for rent and charges?",Can you estimate the outstanding amount?,Estimated outstanding amount,Weekly total rent shortfall charge for tenant receiving housing benefit,What scheme does this letting belong to?,"From scheme code, we map to the scheme name",Does the scheme contain confidential information?,"What is this type of scheme? (Direct access hostel), Foyer, Housing for older people or Other supported housing",Is this scheme registered under the Care Standards Act 2000?,Which organisation owns the housing stock for this scheme?,What client group is this scheme intended for?,Does this scheme provide for another client group?,What is the other client group?,What support does this scheme provide?,Intended length of stay,Date scheme was created,Which location is this letting for?,What is the postcode for this location?,What is the name of this location?,How many units are at this location?,What is the most common type of unit at this location?,What are the mobility standards for the majority of the units in this location?,What is the local authority of this postcode?,When did the first property in this location become available under this scheme? +id,status,duplicate_set_id,created_by,assigned_to,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,bulk_upload_id,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,uprn,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,uprn_known,uprn_selection,address_search_value_check,address_line1_input,postcode_full_input,address_line1_as_entered,address_line2_as_entered,town_or_city_as_entered,county_as_entered,postcode_full_as_entered,la_as_entered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,sheltered,joint,startertenancy,tenancy,tenancyother,tenancylength,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,nationality_all,ecstat1,details_known_2,relat2,partner_under_16_value_check,multiple_partners_value_check,age2,sex2,ecstat2,details_known_3,relat3,age3,sex3,ecstat3,details_known_4,relat4,age4,sex4,ecstat4,details_known_5,relat5,age5,sex5,ecstat5,details_known_6,relat6,age6,sex6,ecstat6,details_known_7,relat7,age7,sex7,ecstat7,details_known_8,relat8,age8,sex8,ecstat8,armedforces,leftreg,reservist,preg_occ,housingneeds,housingneeds_type,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_f,housingneeds_g,housingneeds_h,housingneeds_other,illness,illness_type_4,illness_type_5,illness_type_2,illness_type_6,illness_type_7,illness_type_3,illness_type_9,illness_type_8,illness_type_1,illness_type_10,layear,waityear,reason,reasonother,reasonother_value_check,prevten,homeless,ppcodenk,ppostcode_full,previous_la_known,is_previous_la_inferred,prevloc_label,prevloc,reasonpref,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,cbl,cap,chr,accessible_register,letting_allocation_none,referral_type,referral,referral_value_check,net_income_known,incref,incfreq,earnings,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,brent,wrent,rent_value_check,scharge,wscharge,pscharge,wpschrge,supcharg,wsupchrg,tcharge,wtcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall_known,tshortfall,wtshortfall,scheme_code,scheme_service_name,scheme_confidential,SCHTYPE,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_local_authority,location_startdate +,in_progress,,s.port@jeemayle.com,s.port@jeemayle.com,false,2025-04-01T00:00:00+01:00,,2025-04-01T00:00:00+01:00,single log,2025,,MHCLG,MHCLG,General needs,Affordable rent general needs local authority,No,2025-04-01,Affordable Rent,Affordable Rent,,,No,HIJKLMN,ABCDEFG,Yes,No,Affordable rent basis,Tenant abandoned property,No,,Address line 1,,London,,NW9 5LL,No,Barnet,E09000003,No,,,,,address line 1 as entered,address line 2 as entered,town or city as entered,county as entered,AB1 2CD,la as entered,House,Purpose built,Yes,3,2025-03-30,1,,Yes,2025-03-31,,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,4,,Yes,4,0,0,2,35,,Female,White,Irish,Australia,Other,Yes,Yes,,,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Tenant prefers not to say,Not known,Person prefers not to say,Person prefers not to say,,,,,,,,,,,,,,,,,,,,,Yes – the person is a current or former regular,No – they left up to and including 5 years ago,Yes,No,Yes,Fully wheelchair accessible housing,Yes,No,No,No,No,No,No,Yes,No,No,Yes,No,No,No,No,No,No,No,Less than 1 year,1 year but under 2 years,Loss of tied accommodation,,,Other supported housing,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,No,No,,,,Yes,No,Weekly,268,,Universal Credit housing element,Yes,All,,No,Every 2 weeks,200.0,100.0,,50.0,25.0,40.0,20.0,35.0,17.5,325.0,162.5,,,,Yes,Yes,12.0,6.0,,,,,,,,,,,,,,,,,,,, diff --git a/spec/fixtures/files/lettings_log_csv_export_non_support_codes_25.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_25.csv new file mode 100644 index 000000000..71588b16c --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_25.csv @@ -0,0 +1,3 @@ +Log ID,Status of log,ID of a set of duplicate logs,User the log is assigned to,Is the user in the assigned_to column the data protection officer?,Time and date the log was created,User who last updated the log,Time and date the log was last updated,Was the log submitted in-service or via bulk upload?,Year collection period opened,ID of a set of bulk uploaded logs,Which organisation owns this property?,Which organisation manages this letting?,What is the needs type?,What is the letting type?,Is this letting a renewal?,What is the tenancy start date?,"What is the rent type? (grouped into SR, IR or AR)",What is the rent type?,Which type of Intermediate Rent is this letting?,Which 'Other' type of Intermediate Rent is this letting?,Is this a London Affordable Rent letting?,What is the tenant code?,What is the property reference?,Has the tenant seen the MHCLG privacy notice?,Is this the first time the property has been let as social housing?,What rent product was the property most recently let as?,What is the reason for the property being vacant?,Is this property new to the social rented sector?,Is the UPRN known?,"If known, property's UPRN",Address line 1,Address line 2,Town or City,County,Postcode,What is the property's local authority?,What type of unit is the property?,Which type of building is the property?,Is the property built or adapted to wheelchair-user standards?,How many bedrooms does the property have?,What is the void date?,Number of days the property was vacant,Were any major repairs carried out during the void period?,What date were any major repairs completed on?,Is this letting in sheltered accommodation?,Is this a joint tenancy?,Is this a starter tenancy?,What is the type of tenancy?,"If 'Other', what is the type of tenancy?",What is the length of the fixed-term tenancy to the nearest year?,How many people live in the household at this letting?,"Where household characteristics have a 'Refused' option for some or all of: AGE1-AGE8, SEX1-SEX8, RELAT2-RELAT8, ECSTAT1-ECSTAT8",What is the lead tenant's age?,Which of these best describes the lead tenant's gender identity?,What is the lead tenant's ethnic group?,Which of these best describes the lead tenant's ethnic background?,What is the lead tenant's nationality?,Which of these best describes the lead tenant's working situation?,What is person 2's relationship to the lead tenant?,What is person 2's age?,Which of these best describes person 2's gender identity?,Which of these best describes person 2's working situation?,What is person 3's relationship to the lead tenant?,What is person 3's age?,Which of these best describes person 3's gender identity?,Which of these best describes person 3's working situation?,What is person 4's relationship to the lead tenant?,What is person 4's age?,Which of these best describes person 4's gender identity?,Which of these best describes person 4's working situation?,What is person 5's relationship to the lead tenant?,What is person 5's age?,Which of these best describes person 5's gender identity?,Which of these best describes person 5's working situation?,What is person 6's relationship to the lead tenant?,What is person 6's age?,Which of these best describes person 6's gender identity?,Which of these best describes person 6's working situation?,What is person 7's relationship to the lead tenant?,What is person 7's age?,Which of these best describes person 7's gender identity?,Which of these best describes person 7's working situation?,What is person 8's relationship to the lead tenant?,What is person 8's age?,Which of these best describes person 8's gender identity?,Which of these best describes person 8's working situation?,Does anybody in the household have links to the UK armed forces?,Is this person still serving in the UK armed forces?,Was this person seriously injured or ill as a result of serving in the UK armed forces?,Is anybody in the household pregnant?,Does anybody in the household have any disabled access needs?,"What access needs do they have? (Fully wheelchair-accessible housing, Level access housing or Wheelchair access to essential rooms)",Disabled access needs a) Fully wheelchair-accessible housing,Disabled access needs b) Wheelchair access to essential rooms,Disabled access needs c) Level access housing,Disabled access needs f) Other disabled access needs,Disabled access needs g) No disabled access needs,Disabled access needs h) Don't know,Do they have any other disabled access needs?,Does anybody in the household have a physical or mental health condition (or other illness) expected to last 12 months or more?,Does this person's condition affect their dexterity?,Does this person's condition affect their learning or understanding or concentrating?,Does this person's condition affect their hearing?,Does this person's condition affect their memory?,Does this person's condition affect their mental health?,Does this person's condition affect their mobility?,Does this person's condition affect them socially or behaviourally?,Does this person's condition affect their stamina or breathing or fatigue?,Does this person's condition affect their vision?,Does this person's condition affect them in another way?,How long has the household continuously lived in the local authority area of the new letting?,How long has the household been on the local authority waiting list for the new letting?,What is the tenant's main reason for the household leaving their last settled home?,"If 'Other', what was the main reason for leaving their last settled home?",Where was the household immediately before this letting?,Did the household experience homelessness immediately before this letting?,Previous postcode unknown or previous accommodation was temporary,What is the postcode of the household's last settled home?,Previous location LA name,Was the household given reasonable preference by the local authority?,Reasonable preference reason - They were homeless or about to lose their home (within 56 days),"Reasonable preference reason - They were living in insanitary, overcrowded or unisatisfactory housing",Reasonable preference reason - They needed to move on medical and welfare reasons (including disability),Reasonable preference reason - They needed to move to avoid hardship to themselves or others,Reasonable preference reason - Don't Know,Was the letting made under Choice-Based Lettings (CBL)?,Was the letting made under the Common Allocation Policy (CAP)?,Was the letting made under the Common Housing Register (CHR)?,Was the letting made under the Accessible Register?,"The letting was not allocated under CBL, CAP, CHR or Accessible Register.",,What was the source of referral for this letting?,Was the household income refused?,How often does the household receive income?,How much income does the household have in total?,Is the tenant likely to be receiving any of these housing-related benefits?,"Does the tenant receive housing-related benefits? Yes if hb = Universal Credit housing element or Housing benefit, No if hb = Don't Know, Neither, Tenant prefers not to say or blank","How much of the household's income is from Universal Credit, state pensions or benefits?",Does the household pay rent or other charges for the accommodation?,Does the household pay rent or other charges for the accommodation? - flag for when household_charge is answered no,How often does the household pay rent and other charges?,What is the basic rent?,What is the service charge?,What is the personal service charge?,What is the support charge?,Total charge to the tenant,"After the household has received any housing-related benefits, will they still need to pay for rent and charges?",Estimated outstanding amount,What scheme does this letting belong to?,"From scheme code, we map to the scheme name",Does the scheme contain confidential information?,"What is this type of scheme? (Direct access hostel), Foyer, Housing for older people or Other supported housing",Is this scheme registered under the Care Standards Act 2000?,Which organisation owns the housing stock for this scheme?,What client group is this scheme intended for?,Does this scheme provide for another client group?,What is the other client group?,What support does this scheme provide?,Intended length of stay,Date scheme was created,Which location is this letting for?,What is the postcode for this location?,What is the name of this location?,How many units are at this location?,What is the most common type of unit at this location?,What are the mobility standards for the majority of the units in this location?,What is the local authority of this postcode?,When did the first property in this location become available under this scheme? +id,status,duplicate_set_id,assigned_to,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,bulk_upload_id,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unittype_gn,builtype,wchair,beds,voiddate,vacdays,majorrepairs,mrcdate,sheltered,joint,startertenancy,tenancy,tenancyother,tenancylength,hhmemb,refused,age1,sex1,ethnic_group,ethnic,nationality_all,ecstat1,relat2,age2,sex2,ecstat2,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,relat7,age7,sex7,ecstat7,relat8,age8,sex8,ecstat8,armedforces,leftreg,reservist,preg_occ,housingneeds,housingneeds_type,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_f,housingneeds_g,housingneeds_h,housingneeds_other,illness,illness_type_4,illness_type_5,illness_type_2,illness_type_6,illness_type_7,illness_type_3,illness_type_9,illness_type_8,illness_type_1,illness_type_10,layear,waityear,reason,reasonother,prevten,homeless,ppcodenk,ppostcode_full,prevloc_label,reasonpref,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,cbl,cap,chr,accessible_register,letting_allocation_none,referral_type,referral,incref,incfreq,earnings,hb,has_benefits,benefits,household_charge,nocharge,period,brent,scharge,pscharge,supcharg,tcharge,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_confidential,SCHTYPE,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_local_authority,location_startdate +,in_progress,,choreographer@owtluk.com,false,2025-04-01T00:00:00+01:00,,2025-04-01T00:00:00+01:00,1,2025,,MHCLG,MHCLG,1,7,0,2025-04-01,2,2,,,2,HIJKLMN,ABCDEFG,1,0,2,6,2,0,,Address line 1,,London,,NW9 5LL,Barnet,7,1,1,3,2025-03-30,1,1,2025-03-31,,3,1,4,,2,4,1,35,F,0,2,36,0,P,32,M,6,R,-9,R,10,R,-9,R,10,,,,,,,,,,,,,,,,,1,4,1,2,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,2,7,4,,6,1,0,TN23 6LZ,Ashford,1,0,1,0,0,0,0,0,1,0,0,,,0,1,268,6,1,1,,0,2,200.0,50.0,40.0,35.0,325.0,1,12.0,,,,,,,,,,,,,,,,,,,, diff --git a/spec/fixtures/files/lettings_log_csv_export_non_support_labels_25.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_25.csv new file mode 100644 index 000000000..7244e286c --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_25.csv @@ -0,0 +1,3 @@ +Log ID,Status of log,ID of a set of duplicate logs,User the log is assigned to,Is the user in the assigned_to column the data protection officer?,Time and date the log was created,User who last updated the log,Time and date the log was last updated,Was the log submitted in-service or via bulk upload?,Year collection period opened,ID of a set of bulk uploaded logs,Which organisation owns this property?,Which organisation manages this letting?,What is the needs type?,What is the letting type?,Is this letting a renewal?,What is the tenancy start date?,"What is the rent type? (grouped into SR, IR or AR)",What is the rent type?,Which type of Intermediate Rent is this letting?,Which 'Other' type of Intermediate Rent is this letting?,Is this a London Affordable Rent letting?,What is the tenant code?,What is the property reference?,Has the tenant seen the MHCLG privacy notice?,Is this the first time the property has been let as social housing?,What rent product was the property most recently let as?,What is the reason for the property being vacant?,Is this property new to the social rented sector?,Is the UPRN known?,"If known, property's UPRN",Address line 1,Address line 2,Town or City,County,Postcode,What is the property's local authority?,What type of unit is the property?,Which type of building is the property?,Is the property built or adapted to wheelchair-user standards?,How many bedrooms does the property have?,What is the void date?,Number of days the property was vacant,Were any major repairs carried out during the void period?,What date were any major repairs completed on?,Is this letting in sheltered accommodation?,Is this a joint tenancy?,Is this a starter tenancy?,What is the type of tenancy?,"If 'Other', what is the type of tenancy?",What is the length of the fixed-term tenancy to the nearest year?,How many people live in the household at this letting?,"Where household characteristics have a 'Refused' option for some or all of: AGE1-AGE8, SEX1-SEX8, RELAT2-RELAT8, ECSTAT1-ECSTAT8",What is the lead tenant's age?,Which of these best describes the lead tenant's gender identity?,What is the lead tenant's ethnic group?,Which of these best describes the lead tenant's ethnic background?,What is the lead tenant's nationality?,Which of these best describes the lead tenant's working situation?,What is person 2's relationship to the lead tenant?,What is person 2's age?,Which of these best describes person 2's gender identity?,Which of these best describes person 2's working situation?,What is person 3's relationship to the lead tenant?,What is person 3's age?,Which of these best describes person 3's gender identity?,Which of these best describes person 3's working situation?,What is person 4's relationship to the lead tenant?,What is person 4's age?,Which of these best describes person 4's gender identity?,Which of these best describes person 4's working situation?,What is person 5's relationship to the lead tenant?,What is person 5's age?,Which of these best describes person 5's gender identity?,Which of these best describes person 5's working situation?,What is person 6's relationship to the lead tenant?,What is person 6's age?,Which of these best describes person 6's gender identity?,Which of these best describes person 6's working situation?,What is person 7's relationship to the lead tenant?,What is person 7's age?,Which of these best describes person 7's gender identity?,Which of these best describes person 7's working situation?,What is person 8's relationship to the lead tenant?,What is person 8's age?,Which of these best describes person 8's gender identity?,Which of these best describes person 8's working situation?,Does anybody in the household have links to the UK armed forces?,Is this person still serving in the UK armed forces?,Was this person seriously injured or ill as a result of serving in the UK armed forces?,Is anybody in the household pregnant?,Does anybody in the household have any disabled access needs?,"What access needs do they have? (Fully wheelchair-accessible housing, Level access housing or Wheelchair access to essential rooms)",Disabled access needs a) Fully wheelchair-accessible housing,Disabled access needs b) Wheelchair access to essential rooms,Disabled access needs c) Level access housing,Disabled access needs f) Other disabled access needs,Disabled access needs g) No disabled access needs,Disabled access needs h) Don't know,Do they have any other disabled access needs?,Does anybody in the household have a physical or mental health condition (or other illness) expected to last 12 months or more?,Does this person's condition affect their dexterity?,Does this person's condition affect their learning or understanding or concentrating?,Does this person's condition affect their hearing?,Does this person's condition affect their memory?,Does this person's condition affect their mental health?,Does this person's condition affect their mobility?,Does this person's condition affect them socially or behaviourally?,Does this person's condition affect their stamina or breathing or fatigue?,Does this person's condition affect their vision?,Does this person's condition affect them in another way?,How long has the household continuously lived in the local authority area of the new letting?,How long has the household been on the local authority waiting list for the new letting?,What is the tenant's main reason for the household leaving their last settled home?,"If 'Other', what was the main reason for leaving their last settled home?",Where was the household immediately before this letting?,Did the household experience homelessness immediately before this letting?,Previous postcode unknown or previous accommodation was temporary,What is the postcode of the household's last settled home?,Previous location LA name,Was the household given reasonable preference by the local authority?,Reasonable preference reason - They were homeless or about to lose their home (within 56 days),"Reasonable preference reason - They were living in insanitary, overcrowded or unisatisfactory housing",Reasonable preference reason - They needed to move on medical and welfare reasons (including disability),Reasonable preference reason - They needed to move to avoid hardship to themselves or others,Reasonable preference reason - Don't Know,Was the letting made under Choice-Based Lettings (CBL)?,Was the letting made under the Common Allocation Policy (CAP)?,Was the letting made under the Common Housing Register (CHR)?,Was the letting made under the Accessible Register?,"The letting was not allocated under CBL, CAP, CHR or Accessible Register.",,What was the source of referral for this letting?,Was the household income refused?,How often does the household receive income?,How much income does the household have in total?,Is the tenant likely to be receiving any of these housing-related benefits?,"Does the tenant receive housing-related benefits? Yes if hb = Universal Credit housing element or Housing benefit, No if hb = Don't Know, Neither, Tenant prefers not to say or blank","How much of the household's income is from Universal Credit, state pensions or benefits?",Does the household pay rent or other charges for the accommodation?,Does the household pay rent or other charges for the accommodation? - flag for when household_charge is answered no,How often does the household pay rent and other charges?,What is the basic rent?,What is the service charge?,What is the personal service charge?,What is the support charge?,Total charge to the tenant,"After the household has received any housing-related benefits, will they still need to pay for rent and charges?",Estimated outstanding amount,What scheme does this letting belong to?,"From scheme code, we map to the scheme name",Does the scheme contain confidential information?,"What is this type of scheme? (Direct access hostel), Foyer, Housing for older people or Other supported housing",Is this scheme registered under the Care Standards Act 2000?,Which organisation owns the housing stock for this scheme?,What client group is this scheme intended for?,Does this scheme provide for another client group?,What is the other client group?,What support does this scheme provide?,Intended length of stay,Date scheme was created,Which location is this letting for?,What is the postcode for this location?,What is the name of this location?,How many units are at this location?,What is the most common type of unit at this location?,What are the mobility standards for the majority of the units in this location?,What is the local authority of this postcode?,When did the first property in this location become available under this scheme? +id,status,duplicate_set_id,assigned_to,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,bulk_upload_id,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unittype_gn,builtype,wchair,beds,voiddate,vacdays,majorrepairs,mrcdate,sheltered,joint,startertenancy,tenancy,tenancyother,tenancylength,hhmemb,refused,age1,sex1,ethnic_group,ethnic,nationality_all,ecstat1,relat2,age2,sex2,ecstat2,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,relat7,age7,sex7,ecstat7,relat8,age8,sex8,ecstat8,armedforces,leftreg,reservist,preg_occ,housingneeds,housingneeds_type,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_f,housingneeds_g,housingneeds_h,housingneeds_other,illness,illness_type_4,illness_type_5,illness_type_2,illness_type_6,illness_type_7,illness_type_3,illness_type_9,illness_type_8,illness_type_1,illness_type_10,layear,waityear,reason,reasonother,prevten,homeless,ppcodenk,ppostcode_full,prevloc_label,reasonpref,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,cbl,cap,chr,accessible_register,letting_allocation_none,referral_type,referral,incref,incfreq,earnings,hb,has_benefits,benefits,household_charge,nocharge,period,brent,scharge,pscharge,supcharg,tcharge,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_confidential,SCHTYPE,scheme_registered_under_care_act,scheme_owning_organisation_name,scheme_primary_client_group,scheme_has_other_client_group,scheme_secondary_client_group,scheme_support_type,scheme_intended_stay,scheme_created_at,location_code,location_postcode,location_name,location_units,location_type_of_unit,location_mobility_type,location_local_authority,location_startdate +,in_progress,,choreographer@owtluk.com,false,2025-04-01T00:00:00+01:00,,2025-04-01T00:00:00+01:00,single log,2025,,MHCLG,MHCLG,General needs,Affordable rent general needs local authority,No,2025-04-01,Affordable Rent,Affordable Rent,,,No,HIJKLMN,ABCDEFG,Yes,No,Affordable rent basis,Tenant abandoned property,No,No,,Address line 1,,London,,NW9 5LL,Barnet,House,Purpose built,Yes,3,2025-03-30,1,Yes,2025-03-31,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,4,Yes,35,Female,White,Irish,Australia,Other,Yes,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Tenant prefers not to say,Not known,Person prefers not to say,Person prefers not to say,,,,,,,,,,,,,,,,,Yes – the person is a current or former regular,No – they left up to and including 5 years ago,Yes,No,Yes,Fully wheelchair accessible housing,Yes,No,No,No,No,No,No,Yes,No,No,Yes,No,No,No,No,No,No,No,Less than 1 year,1 year but under 2 years,Loss of tied accommodation,,Other supported housing,No,Yes,TN23 6LZ,Ashford,Yes,,Yes,,,,No,No,Yes,No,No,,,No,Weekly,268,Universal Credit housing element,Yes,All,,No,Every 2 weeks,200.0,50.0,40.0,35.0,325.0,Yes,12.0,,,,,,,,,,,,,,,,,,,, diff --git a/spec/services/csv/lettings_log_csv_service_spec.rb b/spec/services/csv/lettings_log_csv_service_spec.rb index 7a0e15a12..bf45bbe30 100644 --- a/spec/services/csv/lettings_log_csv_service_spec.rb +++ b/spec/services/csv/lettings_log_csv_service_spec.rb @@ -194,6 +194,199 @@ RSpec.describe Csv::LettingsLogCsvService do end describe "the full CSV output" do + context "when the requested log year is 2025" do + let(:year) { 2025 } + let(:organisation) { create(:organisation, provider_type: "LA", name: "MHCLG") } + let(:log) do + create( + :lettings_log, + :ignore_validation_errors, + created_by: user, + assigned_to: user, + created_at: Time.zone.local(2025, 4, 1), + updated_at: Time.zone.local(2025, 4, 1), + owning_organisation: organisation, + managing_organisation: organisation, + needstype: 1, + renewal: 0, + startdate: Time.zone.local(2025, 4, 1), + rent_type: 1, + tenancycode: "HIJKLMN", + propcode: "ABCDEFG", + declaration: 1, + address_line1: "Address line 1", + town_or_city: "London", + postcode_full: "NW9 5LL", + la: "E09000003", + is_la_inferred: false, + address_line1_as_entered: "address line 1 as entered", + address_line2_as_entered: "address line 2 as entered", + town_or_city_as_entered: "town or city as entered", + county_as_entered: "county as entered", + postcode_full_as_entered: "AB1 2CD", + la_as_entered: "la as entered", + first_time_property_let_as_social_housing: 0, + unitletas: 2, + rsnvac: 6, + unittype_gn: 7, + builtype: 1, + wchair: 1, + beds: 3, + voiddate: Time.zone.local(2025, 3, 30), + majorrepairs: 1, + mrcdate: Time.zone.local(2025, 3, 31), + joint: 3, + startertenancy: 1, + tenancy: 4, + tenancylength: 2, + hhmemb: 4, + age1_known: 0, + age1: 35, + sex1: "F", + ethnic_group: 0, + ethnic: 2, + nationality_all: 36, + ecstat1: 0, + details_known_2: 0, + relat2: "P", + age2_known: 0, + age2: 32, + sex2: "M", + ecstat2: 6, + details_known_3: 1, + details_known_4: 0, + relat4: "R", + age4_known: 1, + sex4: "R", + ecstat4: 10, + armedforces: 1, + leftreg: 4, + reservist: 1, + preg_occ: 2, + housingneeds: 1, + housingneeds_type: 0, + housingneeds_a: 1, + housingneeds_b: 0, + housingneeds_c: 0, + housingneeds_f: 0, + housingneeds_g: 0, + housingneeds_h: 0, + housingneeds_other: 0, + illness: 1, + illness_type_1: 0, + illness_type_2: 1, + illness_type_3: 0, + illness_type_4: 0, + illness_type_5: 0, + illness_type_6: 0, + illness_type_7: 0, + illness_type_8: 0, + illness_type_9: 0, + illness_type_10: 0, + layear: 2, + waityear: 7, + reason: 4, + prevten: 6, + homeless: 1, + ppcodenk: 1, + ppostcode_full: "TN23 6LZ", + previous_la_known: 1, + prevloc: "E07000105", + reasonpref: 1, + rp_homeless: 0, + rp_insan_unsat: 1, + rp_medwel: 0, + rp_hardship: 0, + rp_dontknow: 0, + cbl: 0, + chr: 1, + cap: 0, + accessible_register: 0, + referral: 2, + net_income_known: 0, + incref: 0, + incfreq: 1, + earnings: 268, + hb: 6, + has_benefits: 1, + benefits: 1, + period: 2, + brent: 200, + scharge: 50, + pscharge: 40, + supcharg: 35, + tcharge: 325, + hbrentshortfall: 1, + tshortfall_known: 1, + tshortfall: 12, + ) + end + + context "when exporting with human readable labels" do + let(:export_type) { "labels" } + + context "when the current user is a support user" do + let(:user) { create(:user, :support, organisation:, email: "s.port@jeemayle.com") } + + it "exports the CSV with 2025 ordering and all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels_25.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = attribute_line.index(attribute) + content_line[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current user is not a support user" do + let(:user) { create(:user, :data_provider, organisation:, email: "choreographer@owtluk.com") } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels_25.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = attribute_line.index(attribute) + content_line[index] = nil + end + expect(csv).to eq expected_content + end + end + end + + context "when exporting values as codes" do + let(:export_type) { "codes" } + + context "when the current user is a support user" do + let(:user) { create(:user, :support, organisation:, email: "s.port@jeemayle.com") } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes_25.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = attribute_line.index(attribute) + content_line[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current user is not a support user" do + let(:user) { create(:user, :data_provider, organisation:, email: "choreographer@owtluk.com") } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes_25.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = attribute_line.index(attribute) + content_line[index] = nil + end + expect(csv).to eq expected_content + end + end + end + end + context "when the requested log year is 2024" do let(:year) { 2024 } let(:organisation) { create(:organisation, provider_type: "LA", name: "MHCLG") } From 83ab4ffe0fe9d5a5aa7ee804b2f34a16afd18909 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 17 Mar 2025 16:11:29 +0000 Subject: [PATCH 18/31] Fix a typo (#2997) --- app/models/derived_variables/lettings_log_variables.rb | 2 +- app/models/form/lettings/questions/previous_let_type.rb | 2 +- spec/models/form/lettings/questions/previous_let_type_spec.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/derived_variables/lettings_log_variables.rb b/app/models/derived_variables/lettings_log_variables.rb index 1808aaab8..179d08010 100644 --- a/app/models/derived_variables/lettings_log_variables.rb +++ b/app/models/derived_variables/lettings_log_variables.rb @@ -18,7 +18,7 @@ module DerivedVariables::LettingsLogVariables 3 => 6, # "Rent to Buy" => "Rent to Buy basis" 4 => 7, # "London Living Rent" => "London Living Rent basis" 5 => 8, # "Other intermediate rent product" => "Another Intermediate Rent basis" - 6 => 9, # "Specified accommodation - exempt accommodation, managed properties, refuges and local authority hostels" => "Specified accommodation - exempt accommodation, manged properties, refuges and local authority hostels" + 6 => 9, # "Specified accommodation - exempt accommodation, managed properties, refuges and local authority hostels" => "Specified accommodation - exempt accommodation, managed properties, refuges and local authority hostels" }.freeze RENTTYPE_DETAIL_MAPPING = { diff --git a/app/models/form/lettings/questions/previous_let_type.rb b/app/models/form/lettings/questions/previous_let_type.rb index a3b038d6d..8c35df84c 100644 --- a/app/models/form/lettings/questions/previous_let_type.rb +++ b/app/models/form/lettings/questions/previous_let_type.rb @@ -36,7 +36,7 @@ class Form::Lettings::Questions::PreviousLetType < ::Form::Question "6" => { "value" => "Rent to Buy basis" }, "7" => { "value" => "London Living Rent basis" }, "8" => { "value" => "Another Intermediate Rent basis" }, - "9" => { "value" => "Specified accommodation - exempt accommodation, manged properties, refuges and local authority hostels" }, + "9" => { "value" => "Specified accommodation - exempt accommodation, managed properties, refuges and local authority hostels" }, "divider" => { "value" => true }, "3" => { "value" => "Don’t know" }, }.freeze diff --git a/spec/models/form/lettings/questions/previous_let_type_spec.rb b/spec/models/form/lettings/questions/previous_let_type_spec.rb index 27ad8b0b0..ea8b5f67e 100644 --- a/spec/models/form/lettings/questions/previous_let_type_spec.rb +++ b/spec/models/form/lettings/questions/previous_let_type_spec.rb @@ -83,7 +83,7 @@ RSpec.describe Form::Lettings::Questions::PreviousLetType, type: :model do "6" => { "value" => "Rent to Buy basis" }, "7" => { "value" => "London Living Rent basis" }, "8" => { "value" => "Another Intermediate Rent basis" }, - "9" => { "value" => "Specified accommodation - exempt accommodation, manged properties, refuges and local authority hostels" }, + "9" => { "value" => "Specified accommodation - exempt accommodation, managed properties, refuges and local authority hostels" }, "divider" => { "value" => true }, "3" => { "value" => "Don’t know" }, }) From dc4b733245a3798e5db4dd6fdd359695193eb9e8 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 18 Mar 2025 08:39:10 +0000 Subject: [PATCH 19/31] Increase year range for 2025 void and major repairs dates soft validations (#2979) --- app/models/validations/soft_validations.rb | 7 ++-- .../validations/soft_validations_spec.rb | 36 +++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/app/models/validations/soft_validations.rb b/app/models/validations/soft_validations.rb index 9dc8828e8..2f2a9eb89 100644 --- a/app/models/validations/soft_validations.rb +++ b/app/models/validations/soft_validations.rb @@ -103,13 +103,16 @@ module Validations::SoftValidations TWO_YEARS_IN_DAYS = 730 TEN_YEARS_IN_DAYS = 3650 + TWENTY_YEARS_IN_DAYS = 7300 def major_repairs_date_in_soft_range? - mrcdate.present? && startdate.present? && mrcdate.between?(startdate.to_date - TEN_YEARS_IN_DAYS, startdate.to_date - TWO_YEARS_IN_DAYS) + upper_limit = form.start_year_2025_or_later? ? TWENTY_YEARS_IN_DAYS : TEN_YEARS_IN_DAYS + mrcdate.present? && startdate.present? && mrcdate.between?(startdate.to_date - upper_limit, startdate.to_date - TWO_YEARS_IN_DAYS) end def voiddate_in_soft_range? - voiddate.present? && startdate.present? && voiddate.between?(startdate.to_date - TEN_YEARS_IN_DAYS, startdate.to_date - TWO_YEARS_IN_DAYS) + upper_limit = form.start_year_2025_or_later? ? TWENTY_YEARS_IN_DAYS : TEN_YEARS_IN_DAYS + voiddate.present? && startdate.present? && voiddate.between?(startdate.to_date - upper_limit, startdate.to_date - TWO_YEARS_IN_DAYS) end def net_income_higher_or_lower_text diff --git a/spec/models/validations/soft_validations_spec.rb b/spec/models/validations/soft_validations_spec.rb index b4188ba8c..0027c2d71 100644 --- a/spec/models/validations/soft_validations_spec.rb +++ b/spec/models/validations/soft_validations_spec.rb @@ -265,6 +265,24 @@ RSpec.describe Validations::SoftValidations do expect(record.major_repairs_date_in_soft_range?).to be false end end + + context "with 2025 logs" do + context "when the void date is within 20 years of the tenancy start date" do + it "shows the interruption screen" do + record.startdate = Time.zone.local(2026, 2, 1) + record.mrcdate = Time.zone.local(2007, 2, 1) + expect(record.major_repairs_date_in_soft_range?).to be true + end + end + + context "when the void date is less than 2 years before the tenancy start date" do + it "does not show the interruption screen" do + record.startdate = Time.zone.local(2026, 2, 1) + record.mrcdate = Time.zone.local(2025, 2, 1) + expect(record.major_repairs_date_in_soft_range?).to be false + end + end + end end describe "void date soft validations" do @@ -283,6 +301,24 @@ RSpec.describe Validations::SoftValidations do expect(record.voiddate_in_soft_range?).to be false end end + + context "with 2025 logs" do + context "when the void date is within 20 years of the tenancy start date" do + it "shows the interruption screen" do + record.startdate = Time.zone.local(2026, 2, 1) + record.voiddate = Time.zone.local(2007, 2, 1) + expect(record.voiddate_in_soft_range?).to be true + end + end + + context "when the void date is less than 2 years before the tenancy start date" do + it "does not show the interruption screen" do + record.startdate = Time.zone.local(2026, 2, 1) + record.voiddate = Time.zone.local(2025, 2, 1) + expect(record.voiddate_in_soft_range?).to be false + end + end + end end describe "old persons shared ownership soft validations" do From 0d95025ab6861c9ba007f945dcd843b8fa353206 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:48:05 +0000 Subject: [PATCH 20/31] CLDC-3788 Export sales logs (#2943) * Add sales export to the export service * Update sales export * Remove comments and redundant or statement * Update sales export fields * Add mrentprestaircasing, update factory and tests * Enable sales export on test environments * Update fees mappings for the export * Upcase fields and rebase changes * Update some more fields --- app/models/export.rb | 1 + app/services/exports/export_service.rb | 13 +- .../exports/sales_log_export_constants.rb | 146 ++++++ .../exports/sales_log_export_service.rb | 156 +++++++ app/services/feature_toggle.rb | 4 + spec/factories/sales_log.rb | 99 ++++ spec/fixtures/exports/sales_log.xml | 154 +++++++ spec/fixtures/exports/sales_log_2024.xml | 154 +++++++ spec/services/exports/export_service_spec.rb | 247 +++++++++- .../exports/sales_log_export_service_spec.rb | 425 ++++++++++++++++++ 10 files changed, 1392 insertions(+), 7 deletions(-) create mode 100644 app/services/exports/sales_log_export_constants.rb create mode 100644 app/services/exports/sales_log_export_service.rb create mode 100644 spec/fixtures/exports/sales_log.xml create mode 100644 spec/fixtures/exports/sales_log_2024.xml create mode 100644 spec/services/exports/sales_log_export_service_spec.rb diff --git a/app/models/export.rb b/app/models/export.rb index 27e574c72..d820b2f98 100644 --- a/app/models/export.rb +++ b/app/models/export.rb @@ -1,5 +1,6 @@ class Export < ApplicationRecord scope :lettings, -> { where(collection: "lettings") } + scope :sales, -> { where(collection: "sales") } scope :organisations, -> { where(collection: "organisations") } scope :users, -> { where(collection: "users") } end diff --git a/app/services/exports/export_service.rb b/app/services/exports/export_service.rb index 40c10055b..d828fdc49 100644 --- a/app/services/exports/export_service.rb +++ b/app/services/exports/export_service.rb @@ -11,6 +11,7 @@ module Exports start_time = Time.zone.now daily_run_number = get_daily_run_number lettings_archives_for_manifest = {} + sales_archives_for_manifest = {} users_archives_for_manifest = {} organisations_archives_for_manifest = {} @@ -20,16 +21,19 @@ module Exports users_archives_for_manifest = get_user_archives(start_time, full_update) when "organisations" organisations_archives_for_manifest = get_organisation_archives(start_time, full_update) - else + when "lettings" lettings_archives_for_manifest = get_lettings_archives(start_time, full_update, year) + when "sales" + sales_archives_for_manifest = get_sales_archives(start_time, full_update, year) end else users_archives_for_manifest = get_user_archives(start_time, full_update) organisations_archives_for_manifest = get_organisation_archives(start_time, full_update) lettings_archives_for_manifest = get_lettings_archives(start_time, full_update, year) + sales_archives_for_manifest = get_sales_archives(start_time, full_update, year) if FeatureToggle.sales_export_enabled? end - write_master_manifest(daily_run_number, lettings_archives_for_manifest.merge(users_archives_for_manifest).merge(organisations_archives_for_manifest)) + write_master_manifest(daily_run_number, lettings_archives_for_manifest.merge(sales_archives_for_manifest).merge(users_archives_for_manifest).merge(organisations_archives_for_manifest)) end private @@ -74,5 +78,10 @@ module Exports lettings_export_service = Exports::LettingsLogExportService.new(@storage_service, start_time) lettings_export_service.export_xml_lettings_logs(full_update:, collection_year:) end + + def get_sales_archives(start_time, full_update, collection_year) + sales_export_service = Exports::SalesLogExportService.new(@storage_service, start_time) + sales_export_service.export_xml_sales_logs(full_update:, collection_year:) + end end end diff --git a/app/services/exports/sales_log_export_constants.rb b/app/services/exports/sales_log_export_constants.rb new file mode 100644 index 000000000..09a0d5d68 --- /dev/null +++ b/app/services/exports/sales_log_export_constants.rb @@ -0,0 +1,146 @@ +module Exports::SalesLogExportConstants + MAX_XML_RECORDS = 10_000 + LOG_ID_OFFSET = 300_000_000_000 + + EXPORT_MODE = { + xml: 1, + csv: 2, + }.freeze + + EXPORT_FIELDS = Set["ID", + "STATUS", + "DAY", + "MONTH", + "YEAR", + "DUPLICATESET", + "CREATEDDATE", + "UPLOADDATE", + "OWNINGORGID", + "OWNINGORGNAME", + "MANINGORGID", + "MANINGORGNAME", + "USERNAME", + "USERNAMEID", + "PURCHID", + "TYPE", + "OWNERSHIP", + "COLLECTIONYEAR", + "JOINTMORE", + "JOINT", + "BEDS", + "ETHNIC", + "ETHNICGROUP1", + "LIVEINBUYER1", + "BUILTYPE", + "PROPTYPE", + "NOINT", + "LIVEINBUYER2", + "PRIVACYNOTICE", + "WHEEL", + "HHOLDCOUNT", + "LA", + "INCOME1", + "INC1NK", + "INC1MORT", + "INCOME2", + "INC2NK", + "SAVINGSNK", + "SAVINGS", + "PREVOWN", + "AMENDEDBY", + "AMENDEDBYID", + "MORTGAGE", + "INC2MORT", + "HB", + "FROMBEDS", + "STAIRCASE", + "STAIRBOUGHT", + "STAIROWNED", + "MRENT", + "MRENTPRESTAIRCASING", + "RESALE", + "DEPOSIT", + "CASHDIS", + "DISABLED", + "VALUE", + "EQUITY", + "DISCOUNT", + "GRANT", + "PPCODENK", + "PPOSTC1", + "PPOSTC2", + "PREVLOC", + "PREVLOCNAME", + "PREVIOUSLAKNOWN", + "HHREGRES", + "HHREGRESSTILL", + "PROPLEN", + "HASMSCHARGE", + "MSCHARGE", + "PREVTEN", + "MORTGAGEUSED", + "WCHAIR", + "ARMEDFORCESSPOUSE", + "HODAY", + "HOMONTH", + "HOYEAR", + "FROMPROP", + "SOCPREVTEN", + "MORTLEN1", + "EXTRABOR", + "HHTYPE", + "POSTCODE", + "ISLAINFERRED", + "BULKUPLOADID", + "VALUE_VALUE_CHECK", + "PREVSHARED", + "STAIRCASETOSALE", + "ETHNICGROUP2", + "ETHNIC2", + "BUY2LIVING", + "PREVTEN2", + "UPRN", + "ADDRESS1", + "ADDRESS2", + "TOWNCITY", + "COUNTY", + "LANAME", + "CREATIONMETHOD", + "NATIONALITYALL1", + "NATIONALITYALL2", + "MSCHARGE_VALUE_CHECK", + "ADDRESS1INPUT", + "POSTCODEINPUT", + "ADDRESS_SEARCH_VALUE_CHECK", + "UPRNSELECTED", + "BULKADDRESS1", + "BULKADDRESS2", + "BULKTOWNCITY", + "BULKCOUNTY", + "BULKPOSTCODE", + "BULKLA", + "CREATEDBY", + "CREATEDBYID", + "HASESTATEFEE", + "ESTATEFEE", + "FIRSTSTAIR", + "NUMSTAIR", + "STAIRLASTDAY", + "STAIRLASTMONTH", + "STAIRLASTYEAR", + "STAIRINITIALYEAR", + "STAIRINITIALMONTH", + "STAIRINITIALDAY", + "HASSERVICECHARGES", + "SERVICECHARGES",] + + (1..6).each do |index| + EXPORT_FIELDS << "AGE#{index}" + EXPORT_FIELDS << "ECSTAT#{index}" + EXPORT_FIELDS << "SEX#{index}" + end + + (2..6).each do |index| + EXPORT_FIELDS << "RELAT#{index}" + end +end diff --git a/app/services/exports/sales_log_export_service.rb b/app/services/exports/sales_log_export_service.rb new file mode 100644 index 000000000..fa806f6ab --- /dev/null +++ b/app/services/exports/sales_log_export_service.rb @@ -0,0 +1,156 @@ +module Exports + class SalesLogExportService < Exports::XmlExportService + include Exports::SalesLogExportConstants + include CollectionTimeHelper + + def export_xml_sales_logs(full_update: false, collection_year: nil) + archives_for_manifest = {} + collection_years_to_export(collection_year).each do |year| + recent_export = Export.sales.where(year:).order("started_at").last + base_number = Export.sales.where(empty_export: false, year:).maximum(:base_number) || 1 + export = build_export_run("sales", base_number, full_update, year) + archives = write_export_archive(export, year, recent_export, full_update) + + archives_for_manifest.merge!(archives) + + export.empty_export = archives.empty? + export.save! + end + + archives_for_manifest + end + + private + + def get_archive_name(year, base_number, increment) + return unless year + + base_number_str = "f#{base_number.to_s.rjust(4, '0')}" + increment_str = "inc#{increment.to_s.rjust(4, '0')}" + "core_sales_#{year}_#{year + 1}_apr_mar_#{base_number_str}_#{increment_str}".downcase + end + + def retrieve_resources(recent_export, full_update, year) + if !full_update && recent_export + params = { from: recent_export.started_at, to: @start_time } + SalesLog.exportable.where("(updated_at >= :from AND updated_at <= :to) OR (values_updated_at IS NOT NULL AND values_updated_at >= :from AND values_updated_at <= :to)", params).filter_by_year(year) + else + params = { to: @start_time } + SalesLog.exportable.where("updated_at <= :to", params).filter_by_year(year) + end + end + + def apply_cds_transformation(sales_log, _export_mode) + attribute_hash = sales_log.attributes_before_type_cast + + attribute_hash["day"] = sales_log.saledate&.day + attribute_hash["month"] = sales_log.saledate&.month + attribute_hash["year"] = sales_log.saledate&.year + + attribute_hash["createddate"] = sales_log.created_at&.iso8601 + attribute_hash["createdby"] = sales_log.created_by&.email + attribute_hash["createdbyid"] = sales_log.created_by_id + attribute_hash["username"] = sales_log.assigned_to&.email + attribute_hash["usernameid"] = sales_log.assigned_to_id + attribute_hash["uploaddate"] = sales_log.updated_at&.iso8601 + attribute_hash["amendedby"] = sales_log.updated_by&.email + attribute_hash["amendedbyid"] = sales_log.updated_by_id + + attribute_hash["owningorgid"] = sales_log.owning_organisation&.id + attribute_hash["owningorgname"] = sales_log.owning_organisation&.name + attribute_hash["maningorgid"] = sales_log.managing_organisation&.id + attribute_hash["maningorgname"] = sales_log.managing_organisation&.name + + attribute_hash["creationmethod"] = sales_log.creation_method_before_type_cast + attribute_hash["bulkuploadid"] = sales_log.bulk_upload_id + attribute_hash["collectionyear"] = sales_log.form.start_date.year + attribute_hash["ownership"] = sales_log.ownershipsch + attribute_hash["joint"] = sales_log.jointpur + attribute_hash["ethnicgroup1"] = sales_log.ethnic_group + attribute_hash["ethnicgroup2"] = sales_log.ethnic_group2 + attribute_hash["previouslaknown"] = sales_log.previous_la_known + attribute_hash["hasmscharge"] = sales_log.discounted_ownership_sale? ? sales_log.has_mscharge : nil + attribute_hash["mscharge"] = sales_log.discounted_ownership_sale? ? sales_log.mscharge : nil + attribute_hash["hasservicecharges"] = sales_log.shared_ownership_scheme? ? sales_log.has_mscharge : nil + attribute_hash["servicecharges"] = sales_log.shared_ownership_scheme? ? sales_log.mscharge : nil + + attribute_hash["hoday"] = sales_log.hodate&.day + attribute_hash["homonth"] = sales_log.hodate&.month + attribute_hash["hoyear"] = sales_log.hodate&.year + + attribute_hash["inc1nk"] = sales_log.income1nk + attribute_hash["inc2nk"] = sales_log.income2nk + attribute_hash["postcode"] = sales_log.postcode_full + attribute_hash["islainferred"] = sales_log.is_la_inferred + attribute_hash["mortlen1"] = sales_log.mortlen + attribute_hash["ethnic2"] = sales_log.ethnicbuy2 + attribute_hash["prevten2"] = sales_log.prevtenbuy2 + + attribute_hash["address1"] = sales_log.address_line1 + attribute_hash["address2"] = sales_log.address_line2 + attribute_hash["towncity"] = sales_log.town_or_city + attribute_hash["laname"] = LocalAuthority.find_by(code: sales_log.la)&.name + attribute_hash["address1input"] = sales_log.address_line1_input + attribute_hash["postcodeinput"] = sales_log.postcode_full_input + attribute_hash["uprnselected"] = sales_log.uprn_selection + + attribute_hash["bulkaddress1"] = sales_log.address_line1_as_entered + attribute_hash["bulkaddress2"] = sales_log.address_line2_as_entered + attribute_hash["bulktowncity"] = sales_log.town_or_city_as_entered + attribute_hash["bulkcounty"] = sales_log.county_as_entered + attribute_hash["bulkpostcode"] = sales_log.postcode_full_as_entered + attribute_hash["bulkla"] = sales_log.la_as_entered + attribute_hash["nationalityall1"] = sales_log.nationality_all + attribute_hash["nationalityall2"] = sales_log.nationality_all_buyer2 + attribute_hash["prevlocname"] = LocalAuthority.find_by(code: sales_log.prevloc)&.name + attribute_hash["liveinbuyer1"] = sales_log.buy1livein + attribute_hash["liveinbuyer2"] = sales_log.buy2livein + + attribute_hash["hasestatefee"] = sales_log.has_management_fee + attribute_hash["estatefee"] = sales_log.management_fee + + attribute_hash["stairlastday"] = sales_log.lasttransaction&.day + attribute_hash["stairlastmonth"] = sales_log.lasttransaction&.month + attribute_hash["stairlastyear"] = sales_log.lasttransaction&.year + + attribute_hash["stairinitialday"] = sales_log.initialpurchase&.day + attribute_hash["stairinitialmonth"] = sales_log.initialpurchase&.month + attribute_hash["stairinitialyear"] = sales_log.initialpurchase&.year + attribute_hash["mscharge_value_check"] = sales_log.monthly_charges_value_check + attribute_hash["duplicateset"] = sales_log.duplicate_set_id + attribute_hash["staircasetosale"] = sales_log.staircasesale + + attribute_hash.transform_keys!(&:upcase) + attribute_hash + end + + def is_omitted_field?(field_name, _sales_log) + !EXPORT_FIELDS.include?(field_name) + end + + def build_export_xml(sales_logs) + doc = Nokogiri::XML("") + + sales_logs.each do |sales_log| + attribute_hash = apply_cds_transformation(sales_log, EXPORT_MODE[:xml]) + form = doc.create_element("form") + doc.at("forms") << form + attribute_hash.each do |key, value| + if is_omitted_field?(key, sales_log) + next + else + form << doc.create_element(key, value) + end + end + end + + xml_doc_to_temp_file(doc) + end + + def collection_years_to_export(collection_year) + return [collection_year] if collection_year.present? + + FormHandler.instance.sales_forms.values.map { |f| f.start_date.year }.uniq.select { |year| year > 2024 } + end + end +end diff --git a/app/services/feature_toggle.rb b/app/services/feature_toggle.rb index 93a92dcd4..4b2c440fc 100644 --- a/app/services/feature_toggle.rb +++ b/app/services/feature_toggle.rb @@ -30,4 +30,8 @@ class FeatureToggle def self.create_test_logs_enabled? Rails.env.development? || Rails.env.review? end + + def self.sales_export_enabled? + Time.zone.now >= Time.zone.local(2025, 4, 1) || (Rails.env.review? || Rails.env.staging?) + end end diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index 4c83fd04d..856a6d7e1 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -235,5 +235,104 @@ FactoryBot.define do instance.save!(validate: false) end end + trait :export do + purchid { "123" } + ownershipsch { 2 } + type { 8 } + saledate_today + jointpur { 1 } + beds { 2 } + jointmore { 1 } + noint { 2 } + privacynotice { 1 } + age1_known { 0 } + age1 { 27 } + sex1 { "F" } + national { 18 } + buy1livein { 1 } + relat2 { "P" } + proptype { 1 } + age2_known { 0 } + age2 { 33 } + builtype { 1 } + ethnic { 3 } + ethnic_group { 17 } + sex2 { "X" } + buy2livein { "1" } + ecstat1 { "1" } + ecstat2 { "1" } + hholdcount { "4" } + wheel { 1 } + details_known_3 { 1 } + age3_known { 0 } + age3 { 14 } + details_known_4 { 1 } + age4_known { 0 } + age4 { 18 } + details_known_5 { 1 } + age5_known { 0 } + age5 { 40 } + details_known_6 { 1 } + age6_known { 0 } + age6 { 40 } + income1nk { 0 } + income1 { 10_000 } + inc1mort { 1 } + income2nk { 0 } + income2 { 10_000 } + inc2mort { 1 } + uprn_known { 0 } + address_line1 { "Address line 1" } + town_or_city { "City" } + la_known { 1 } + la { "E09000003" } + savingsnk { 1 } + prevown { 1 } + prevshared { 2 } + sex3 { "F" } + sex4 { "X" } + sex5 { "M" } + sex6 { "X" } + mortgage { 20_000 } + ecstat3 { 9 } + ecstat4 { 3 } + ecstat5 { 2 } + ecstat6 { 1 } + disabled { 1 } + deposit { 80_000 } + value { 110_000 } + value_value_check { 0 } + grant { 10_000 } + hhregres { 7 } + ppcodenk { 1 } + prevten { 1 } + previous_la_known { 0 } + relat3 { "X" } + relat4 { "X" } + relat5 { "R" } + relat6 { "R" } + hb { 4 } + mortgageused { 1 } + wchair { 1 } + armedforcesspouse { 5 } + has_mscharge { 1 } + mscharge { 100 } + mortlen { 10 } + pcodenk { 0 } + postcode_full { "SW1A 1AA" } + is_la_inferred { false } + mortgagelender { 5 } + extrabor { 1 } + ethnic_group2 { 17 } + nationalbuy2 { 13 } + buy2living { 3 } + proplen_asked { 1 } + address_line1_input { "Address line 1" } + postcode_full_input { "SW1A 1AA" } + nationality_all_group { 826 } + nationality_all_buyer2_group { 826 } + uprn { "10033558653" } + uprn_selection { 1 } + end end end diff --git a/spec/fixtures/exports/sales_log.xml b/spec/fixtures/exports/sales_log.xml new file mode 100644 index 000000000..37dc6dda5 --- /dev/null +++ b/spec/fixtures/exports/sales_log.xml @@ -0,0 +1,154 @@ + + +
+ {id} + 1 + 123 + 8 + 1 + 2 + 27 + F + 17 + 1 + 1 + 33 + P + X + 2 + 1 + 1 + 1 + 1 + 4 + 14 + E09000033 + 10000 + 18 + 40 + 40 + 1 + 10000 + 1 + + 1 + F + 20000.0 + 1 + 9 + 3 + 2 + 1 + X + X + R + R + 4 + X + M + X + + + + + + + 80000.0 + + 1 + 110000.0 + + + 10000.0 + 0 + SW1A + 1AA + E09000033 + 7 + + + 100.0 + 1 + 1 + 1 + 5 + + + + + + 1 + 6 + + 2 + 3 + + + + + + + 1 + 3 + 2026 + 2026-03-01T00:00:00+00:00 + {created_by_email} + {created_by_id} + {assigned_to_email} + {assigned_to_id} + 2026-03-01T00:00:00+00:00 + + + {owning_org_id} + {owning_org_name} + {managing_org_id} + {managing_org_name} + 1 + + 2025 + 2 + 1 + 17 + 17 + 1 + 1 + + + 0 + 0 + SW1A 1AA + true + 10 + + + Address line 1 + + City + Westminster + Address line 1 + SW1A 1AA + + + + + + + + 826 + 826 + Westminster + 1 + 1 + + + + + + + + + + + + +
diff --git a/spec/fixtures/exports/sales_log_2024.xml b/spec/fixtures/exports/sales_log_2024.xml new file mode 100644 index 000000000..e894ac973 --- /dev/null +++ b/spec/fixtures/exports/sales_log_2024.xml @@ -0,0 +1,154 @@ + + +
+ {id} + 2 + 123 + 8 + 1 + 2 + 27 + F + 17 + 1 + 1 + 33 + P + X + 2 + 1 + 1 + 1 + 1 + 4 + 14 + E09000033 + 10000 + 18 + 40 + 40 + 1 + 10000 + 1 + + 1 + F + 20000.0 + 1 + 9 + 3 + 2 + 1 + X + X + R + R + 4 + X + M + X + + + + + + + 80000.0 + + 1 + 110000.0 + + + 10000.0 + 0 + SW1A + 1AA + E09000033 + 7 + + + 100.0 + 1 + 1 + 1 + 5 + + + + + + 1 + 6 + + 2 + 3 + + + + + + + 3 + 4 + 2024 + 2024-04-03T00:00:00+01:00 + {created_by_email} + {created_by_id} + {assigned_to_email} + {assigned_to_id} + 2024-04-03T00:00:00+01:00 + + + {owning_org_id} + {owning_org_name} + {managing_org_id} + {managing_org_name} + 1 + + 2024 + 2 + 1 + 17 + 17 + 1 + 1 + + + 0 + 0 + SW1A 1AA + true + 10 + + + Address line 1 + + City + Westminster + Address line 1 + SW1A 1AA + + + + + + + + 826 + 826 + Westminster + 1 + 1 + + + + + + + + + + + + +
diff --git a/spec/services/exports/export_service_spec.rb b/spec/services/exports/export_service_spec.rb index fb52c5274..051a0f38d 100644 --- a/spec/services/exports/export_service_spec.rb +++ b/spec/services/exports/export_service_spec.rb @@ -9,12 +9,14 @@ RSpec.describe Exports::ExportService do let(:user) { FactoryBot.create(:user, email: "test1@example.com") } let(:organisations_export_service) { instance_double("Exports::OrganisationExportService", export_xml_organisations: {}) } let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: {}) } + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: {}) } before do Timecop.freeze(start_time) Singleton.__init__(FormHandler) allow(storage_service).to receive(:write_file) allow(Exports::LettingsLogExportService).to receive(:new).and_return(lettings_logs_export_service) + allow(Exports::SalesLogExportService).to receive(:new).and_return(sales_logs_export_service) allow(Exports::UserExportService).to receive(:new).and_return(users_export_service) allow(Exports::OrganisationExportService).to receive(:new).and_return(organisations_export_service) end @@ -23,7 +25,9 @@ RSpec.describe Exports::ExportService do Timecop.return end - context "when exporting daily XMLs" do + context "when exporting daily XMLs before 2025" do + let(:start_time) { Time.zone.local(2022, 5, 1) } + context "and no lettings archives get created in lettings logs export" do let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: {}) } @@ -193,6 +197,64 @@ RSpec.describe Exports::ExportService do end end end + + context "and multiple sales archives get created in sales logs export" do + let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: { "some_file_base_name" => start_time, "second_file_base_name" => start_time }) } + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: { "some_sales_file_base_name" => start_time, "second_sales_file_base_name" => start_time }) } + + context "and no user archives get created in user export" do + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2022-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2022-05-01 00:00:00 +0100,second_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + + context "and multiple user archive gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time, "second_user_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2022-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2022-05-01 00:00:00 +0100,second_file_base_name.zip\nsome_user_file_base_name,2022-05-01 00:00:00 +0100,some_user_file_base_name.zip\nsecond_user_file_base_name,2022-05-01 00:00:00 +0100,second_user_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + + context "and multiple user and organisation archives gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time, "second_user_file_base_name" => start_time }) } + let(:organisations_export_service) { instance_double("Exports::OrganisationExportService", export_xml_organisations: { "some_organisation_file_base_name" => start_time, "second_organisation_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2022-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2022-05-01 00:00:00 +0100,second_file_base_name.zip\nsome_user_file_base_name,2022-05-01 00:00:00 +0100,some_user_file_base_name.zip\nsecond_user_file_base_name,2022-05-01 00:00:00 +0100,second_user_file_base_name.zip\nsome_organisation_file_base_name,2022-05-01 00:00:00 +0100,some_organisation_file_base_name.zip\nsecond_organisation_file_base_name,2022-05-01 00:00:00 +0100,second_organisation_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + end end context "when exporting specific lettings log collection" do @@ -204,7 +266,7 @@ RSpec.describe Exports::ExportService do it "generates a master manifest with the correct name" do expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) - export_service.export_xml(full_update: true, collection: "2022") + export_service.export_xml(full_update: true, collection: "lettings", year: "2022") end it "does not write user data" do @@ -212,7 +274,7 @@ RSpec.describe Exports::ExportService do expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\n" allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } - export_service.export_xml(full_update: true, collection: "2022") + export_service.export_xml(full_update: true, collection: "lettings", year: "2022") expect(actual_content).to eq(expected_content) end end @@ -226,7 +288,7 @@ RSpec.describe Exports::ExportService do it "generates a master manifest with the correct name" do expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) - export_service.export_xml(full_update: true, collection: "2023") + export_service.export_xml(full_update: true, collection: "lettings", year: "2023") end it "does not write user data" do @@ -234,7 +296,7 @@ RSpec.describe Exports::ExportService do expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2022-05-01 00:00:00 +0100,some_file_base_name.zip\n" allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } - export_service.export_xml(full_update: true, collection: "2023") + export_service.export_xml(full_update: true, collection: "lettings", year: "2023") expect(actual_content).to eq(expected_content) end end @@ -330,4 +392,179 @@ RSpec.describe Exports::ExportService do end end end + + context "with date after 2025-04-01" do + let(:start_time) { Time.zone.local(2025, 5, 1) } + let(:expected_master_manifest_filename) { "Manifest_2025_05_01_0001.csv" } + + context "when exporting daily XMLs" do + context "and no sales archives get created in sales logs export" do + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: {}) } + let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: {}) } + + context "and no user or organisation archives get created in user export" do + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers but no data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + end + + context "and one sales archive gets created in sales logs export" do + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: { "some_sales_file_base_name" => start_time }) } + let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: { "some_file_base_name" => start_time }) } + + context "and no user archives get created in user export" do + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2025-05-01 00:00:00 +0100,some_file_base_name.zip\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + + context "and one user archive gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2025-05-01 00:00:00 +0100,some_file_base_name.zip\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\nsome_user_file_base_name,2025-05-01 00:00:00 +0100,some_user_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + end + + context "and multiple sales archives get created in sales logs export" do + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: { "some_sales_file_base_name" => start_time, "second_sales_file_base_name" => start_time }) } + let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: { "some_file_base_name" => start_time, "second_file_base_name" => start_time }) } + + context "and no user archives get created in user export" do + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2025-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2025-05-01 00:00:00 +0100,second_file_base_name.zip\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\nsecond_sales_file_base_name,2025-05-01 00:00:00 +0100,second_sales_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + + context "and multiple user archive gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time, "second_user_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2025-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2025-05-01 00:00:00 +0100,second_file_base_name.zip\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\nsecond_sales_file_base_name,2025-05-01 00:00:00 +0100,second_sales_file_base_name.zip\nsome_user_file_base_name,2025-05-01 00:00:00 +0100,some_user_file_base_name.zip\nsecond_user_file_base_name,2025-05-01 00:00:00 +0100,second_user_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + + context "and multiple user and organisation archives gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time, "second_user_file_base_name" => start_time }) } + let(:organisations_export_service) { instance_double("Exports::OrganisationExportService", export_xml_organisations: { "some_organisation_file_base_name" => start_time, "second_organisation_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml + end + + it "generates a master manifest with CSV headers and correct data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_file_base_name,2025-05-01 00:00:00 +0100,some_file_base_name.zip\nsecond_file_base_name,2025-05-01 00:00:00 +0100,second_file_base_name.zip\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\nsecond_sales_file_base_name,2025-05-01 00:00:00 +0100,second_sales_file_base_name.zip\nsome_user_file_base_name,2025-05-01 00:00:00 +0100,some_user_file_base_name.zip\nsecond_user_file_base_name,2025-05-01 00:00:00 +0100,second_user_file_base_name.zip\nsome_organisation_file_base_name,2025-05-01 00:00:00 +0100,some_organisation_file_base_name.zip\nsecond_organisation_file_base_name,2025-05-01 00:00:00 +0100,second_organisation_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml + expect(actual_content).to eq(expected_content) + end + end + end + end + end + + context "when exporting specific sales log collection" do + let(:start_time) { Time.zone.local(2025, 5, 1) } + let(:expected_master_manifest_filename) { "Manifest_2025_05_01_0001.csv" } + let(:lettings_logs_export_service) { instance_double("Exports::LettingsLogExportService", export_xml_lettings_logs: {}) } + + context "and no sales archives get created in sales logs export" do + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: {}) } + + context "and user archive gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml(full_update: true, collection: "sales", year: "2022") + end + + it "does not write user data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml(full_update: true, collection: "sales", year: "2022") + expect(actual_content).to eq(expected_content) + end + end + end + + context "and sales archive gets created in sales logs export" do + let(:sales_logs_export_service) { instance_double("Exports::SalesLogExportService", export_xml_sales_logs: { "some_sales_file_base_name" => start_time }) } + + context "and user archive gets created in user export" do + let(:users_export_service) { instance_double("Exports::UserExportService", export_xml_users: { "some_user_file_base_name" => start_time }) } + + it "generates a master manifest with the correct name" do + expect(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) + export_service.export_xml(full_update: true, collection: "sales", year: "2023") + end + + it "does not write user data" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\nsome_sales_file_base_name,2025-05-01 00:00:00 +0100,some_sales_file_base_name.zip\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml(full_update: true, collection: "sales", year: "2023") + expect(actual_content).to eq(expected_content) + end + end + end + end end diff --git a/spec/services/exports/sales_log_export_service_spec.rb b/spec/services/exports/sales_log_export_service_spec.rb new file mode 100644 index 000000000..c11c13712 --- /dev/null +++ b/spec/services/exports/sales_log_export_service_spec.rb @@ -0,0 +1,425 @@ +require "rails_helper" + +RSpec.describe Exports::SalesLogExportService do + subject(:export_service) { described_class.new(storage_service, start_time) } + + let(:storage_service) { instance_double(Storage::S3Service) } + + let(:xml_export_file) { File.open("spec/fixtures/exports/sales_log.xml", "r:UTF-8") } + let(:local_manifest_file) { File.open("spec/fixtures/exports/manifest.xml", "r:UTF-8") } + + let(:expected_zip_filename) { "core_sales_2025_2026_apr_mar_f0001_inc0001.zip" } + let(:expected_data_filename) { "core_sales_2025_2026_apr_mar_f0001_inc0001_pt001.xml" } + let(:expected_manifest_filename) { "manifest.xml" } + let(:start_time) { Time.zone.local(2026, 3, 1) } + let(:organisation) { create(:organisation, name: "MHCLG", housing_registration_no: 1234) } + let(:user) { FactoryBot.create(:user, email: "test1@example.com", organisation:) } + + def replace_entity_ids(sales_log, export_template) + export_template.sub!(/\{owning_org_id\}/, sales_log["owning_organisation_id"].to_s) + export_template.sub!(/\{owning_org_name\}/, sales_log.owning_organisation.name.to_s) + export_template.sub!(/\{managing_org_id\}/, sales_log["managing_organisation_id"].to_s) + export_template.sub!(/\{managing_org_name\}/, sales_log.managing_organisation.name.to_s) + export_template.sub!(/\{assigned_to_id\}/, sales_log["assigned_to_id"].to_s) + export_template.sub!(/\{assigned_to_email\}/, sales_log.assigned_to&.email.to_s) + export_template.sub!(/\{created_by_id\}/, sales_log["created_by_id"].to_s) + export_template.sub!(/\{created_by_email\}/, sales_log.created_by&.email.to_s) + export_template.sub!(/\{id\}/, sales_log["id"].to_s) + end + + def replace_record_number(export_template, record_number) + export_template.sub!(/\{recno\}/, record_number.to_s) + end + + before do + Timecop.freeze(start_time) + Singleton.__init__(FormHandler) + allow(storage_service).to receive(:write_file) + end + + after do + Timecop.return + end + + context "when exporting daily sales logs in XML" do + context "and no sales logs are available for export" do + it "returns an empty archives list" do + expect(storage_service).not_to receive(:write_file) + expect(export_service.export_xml_sales_logs).to eq({}) + end + end + + context "when one pending sales log exists" do + before do + FactoryBot.create( + :sales_log, + :export, + status: "pending", + skip_update_status: true, + ) + end + + it "returns empty archives list for archives manifest" do + expect(storage_service).not_to receive(:write_file) + expect(export_service.export_xml_sales_logs).to eq({}) + end + end + + context "and one sales log is available for export" do + let!(:sales_log) { FactoryBot.create(:sales_log, :export, assigned_to: user) } + + it "generates a ZIP export file with the expected filename" do + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) + export_service.export_xml_sales_logs + end + + it "generates an XML export file with the expected filename within the ZIP file" do + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.name).to eq(expected_data_filename) + end + export_service.export_xml_sales_logs + end + + it "generates an XML manifest file with the expected content within the ZIP file" do + expected_content = replace_record_number(local_manifest_file.read, 1) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_manifest_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + + it "generates an XML export file with the expected content within the ZIP file" do + expected_content = replace_entity_ids(sales_log, xml_export_file.read) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + + it "returns the list with correct archive" do + expect(export_service.export_xml_sales_logs).to eq({ expected_zip_filename.gsub(".zip", "") => start_time }) + end + end + + context "and multiple sales logs are available for export on different periods" do + let(:previous_zip_filename) { "core_sales_2024_2025_apr_mar_f0001_inc0001.zip" } + let(:next_zip_filename) { "core_sales_2026_2027_apr_mar_f0001_inc0001.zip" } + + before do + FactoryBot.create(:sales_log, :ignore_validation_errors, saledate: Time.zone.local(2024, 5, 1)) + FactoryBot.create(:sales_log, saledate: Time.zone.local(2025, 5, 1)) + FactoryBot.create(:sales_log, :ignore_validation_errors, saledate: Time.zone.local(2026, 4, 1)) + end + + context "when sales logs are across multiple years" do + it "generates multiple ZIP export files with the expected filenames" do + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) + expect(storage_service).not_to receive(:write_file).with(previous_zip_filename, any_args) + expect(storage_service).to receive(:write_file).with(next_zip_filename, any_args) + expect(Rails.logger).to receive(:info).with("Building export run for sales 2025") + expect(Rails.logger).to receive(:info).with("Creating core_sales_2025_2026_apr_mar_f0001_inc0001 - 1 resources") + expect(Rails.logger).to receive(:info).with("Added core_sales_2025_2026_apr_mar_f0001_inc0001_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_sales_2025_2026_apr_mar_f0001_inc0001.zip") + expect(Rails.logger).to receive(:info).with("Building export run for sales 2026") + expect(Rails.logger).to receive(:info).with("Creating core_sales_2026_2027_apr_mar_f0001_inc0001 - 1 resources") + expect(Rails.logger).to receive(:info).with("Added core_sales_2026_2027_apr_mar_f0001_inc0001_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_sales_2026_2027_apr_mar_f0001_inc0001.zip") + + export_service.export_xml_sales_logs + end + + it "generates zip export files only for specified year" do + expect(storage_service).to receive(:write_file).with(next_zip_filename, any_args) + expect(Rails.logger).to receive(:info).with("Building export run for sales 2026") + expect(Rails.logger).to receive(:info).with("Creating core_sales_2026_2027_apr_mar_f0001_inc0001 - 1 resources") + expect(Rails.logger).to receive(:info).with("Added core_sales_2026_2027_apr_mar_f0001_inc0001_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_sales_2026_2027_apr_mar_f0001_inc0001.zip") + + export_service.export_xml_sales_logs(collection_year: 2026) + end + + context "and previous full exports are different for previous years" do + let(:expected_zip_filename) { "core_sales_2025_2026_apr_mar_f0007_inc0004.zip" } + let(:next_zip_filename) { "core_sales_2026_2027_apr_mar_f0001_inc0001.zip" } + + before do + Export.new(started_at: Time.zone.yesterday, base_number: 7, increment_number: 3, collection: "sales", year: 2025).save! + end + + it "generates multiple ZIP export files with different base numbers in the filenames" do + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) + expect(storage_service).to receive(:write_file).with(next_zip_filename, any_args) + expect(Rails.logger).to receive(:info).with("Building export run for sales 2025") + expect(Rails.logger).to receive(:info).with("Creating core_sales_2025_2026_apr_mar_f0007_inc0004 - 1 resources") + expect(Rails.logger).to receive(:info).with("Added core_sales_2025_2026_apr_mar_f0007_inc0004_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_sales_2025_2026_apr_mar_f0007_inc0004.zip") + expect(Rails.logger).to receive(:info).with("Building export run for sales 2026") + expect(Rails.logger).to receive(:info).with("Creating core_sales_2026_2027_apr_mar_f0001_inc0001 - 1 resources") + expect(Rails.logger).to receive(:info).with("Added core_sales_2026_2027_apr_mar_f0001_inc0001_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_sales_2026_2027_apr_mar_f0001_inc0001.zip") + + export_service.export_xml_sales_logs + end + end + end + end + + context "and multiple sales logs are available for export on same quarter" do + before do + FactoryBot.create(:sales_log, saledate: Time.zone.local(2025, 4, 1)) + FactoryBot.create(:sales_log, saledate: Time.zone.local(2025, 4, 20)) + end + + it "generates an XML manifest file with the expected content within the ZIP file" do + expected_content = replace_record_number(local_manifest_file.read, 2) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_manifest_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + + it "creates a logs export record in a database with correct time" do + expect { export_service.export_xml_sales_logs } + .to change(Export, :count).by(2) + expect(Export.last.started_at).to be_within(2.seconds).of(start_time) + end + + context "when this is the first export (full)" do + it "returns a ZIP archive for the master manifest (existing sales logs)" do + expect(export_service.export_xml_sales_logs).to eq({ expected_zip_filename.gsub(".zip", "").gsub(".zip", "") => start_time }) + end + end + + context "and underlying data changes between getting the logs and writting the manifest" do + before do + FactoryBot.create(:sales_log, saledate: Time.zone.local(2026, 2, 1)) + FactoryBot.create(:sales_log, :ignore_validation_errors, saledate: Time.zone.local(2026, 4, 1)) + end + + def remove_logs(logs) + logs.each(&:destroy) + file = Tempfile.new + doc = Nokogiri::XML("") + doc.write_xml_to(file, encoding: "UTF-8") + file.rewind + file + end + + def create_fake_maifest + file = Tempfile.new + doc = Nokogiri::XML("") + doc.write_xml_to(file, encoding: "UTF-8") + file.rewind + file + end + + it "maintains the same record number" do + # rubocop:disable RSpec/SubjectStub + allow(export_service).to receive(:build_export_xml) do |logs| + remove_logs(logs) + end + allow(export_service).to receive(:build_manifest_xml) do + create_fake_maifest + end + + expect(export_service).to receive(:build_manifest_xml).with(1) + # rubocop:enable RSpec/SubjectStub + export_service.export_xml_sales_logs + end + end + + context "when this is a second export (partial)" do + before do + start_time = Time.zone.local(2026, 6, 1) + Export.new(started_at: start_time, collection: "sales", year: 2025).save! + end + + it "does not add any entry for the master manifest (no sales logs)" do + expect(storage_service).not_to receive(:write_file) + expect(export_service.export_xml_sales_logs).to eq({}) + end + end + end + + context "and a previous export has run the same day having sales logs" do + before do + FactoryBot.create(:sales_log, saledate: Time.zone.local(2025, 5, 1)) + export_service.export_xml_sales_logs + end + + context "and we trigger another full update" do + it "increments the base number" do + export_service.export_xml_sales_logs(full_update: true) + expect(Export.last.base_number).to eq(2) + end + + it "resets the increment number" do + export_service.export_xml_sales_logs(full_update: true) + expect(Export.last.increment_number).to eq(1) + end + + it "returns a correct archives list for manifest file" do + expect(export_service.export_xml_sales_logs(full_update: true)).to eq({ "core_sales_2025_2026_apr_mar_f0002_inc0001" => start_time }) + end + + it "generates a ZIP export file with the expected filename" do + expect(storage_service).to receive(:write_file).with("core_sales_2025_2026_apr_mar_f0002_inc0001.zip", any_args) + export_service.export_xml_sales_logs(full_update: true) + end + end + end + + context "and a previous export has run having no sales logs" do + before { export_service.export_xml_sales_logs } + + it "doesn't increment the manifest number by 1" do + export_service.export_xml_sales_logs + + expect(Export.last.increment_number).to eq(1) + end + end + + context "and a log has been manually updated since the previous partial export" do + let(:expected_zip_filename) { "core_sales_2025_2026_apr_mar_f0001_inc0002.zip" } + + before do + FactoryBot.create(:sales_log, saledate: Time.zone.local(2026, 2, 1), updated_at: Time.zone.local(2026, 2, 27), values_updated_at: Time.zone.local(2026, 2, 29)) + FactoryBot.create(:sales_log, saledate: Time.zone.local(2026, 2, 1), updated_at: Time.zone.local(2026, 2, 27), values_updated_at: Time.zone.local(2026, 2, 29)) + Export.create!(started_at: Time.zone.local(2026, 2, 28), base_number: 1, increment_number: 1, collection: "sales", year: 2025) + end + + it "generates an XML manifest file with the expected content within the ZIP file" do + expected_content = replace_record_number(local_manifest_file.read, 2) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_manifest_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + expect(export_service.export_xml_sales_logs).to eq({ expected_zip_filename.gsub(".zip", "") => start_time }) + end + end + + context "and one sales log with duplicate reference is available for export" do + let!(:sales_log) { FactoryBot.create(:sales_log, :export, duplicate_set_id: 123) } + + def replace_duplicate_set_id(export_file) + export_file.sub!("", "123") + end + + it "generates an XML export file with the expected content within the ZIP file" do + expected_content = replace_entity_ids(sales_log, xml_export_file.read) + expected_content = replace_duplicate_set_id(expected_content) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + end + + context "when exporting only 24/25 collection period" do + let(:start_time) { Time.zone.local(2024, 4, 3) } + + before do + Timecop.freeze(start_time) + Singleton.__init__(FormHandler) + end + + after do + Timecop.unfreeze + Singleton.__init__(FormHandler) + end + + context "and one sales log is available for export" do + let!(:sales_log) { FactoryBot.create(:sales_log, :export) } + let(:expected_zip_filename) { "core_sales_2024_2025_apr_mar_f0001_inc0001.zip" } + let(:expected_data_filename) { "core_sales_2024_2025_apr_mar_f0001_inc0001_pt001.xml" } + let(:xml_export_file) { File.open("spec/fixtures/exports/sales_log_2024.xml", "r:UTF-8") } + + it "generates an XML export file with the expected content within the ZIP file" do + expected_content = replace_entity_ids(sales_log, xml_export_file.read) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs(full_update: true, collection_year: 2024) + end + end + end + + context "when exporting various fees, correctly maps the values" do + context "with discounted ownership and mscharge" do + let!(:sales_log) { FactoryBot.create(:sales_log, :export, mscharge: 123) } + + def replace_mscharge_value(export_file) + export_file.sub!("100.0", "123.0") + end + + it "exports mscharge fields as hasmscharge and mscharge" do + expected_content = replace_entity_ids(sales_log, xml_export_file.read) + expected_content = replace_mscharge_value(expected_content) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + end + + context "with shared ownership and mscharge" do + let!(:sales_log) { FactoryBot.create(:sales_log, :export, ownershipsch: 1, staircase: 2, type: 30, mscharge: 321, has_management_fee: 1, management_fee: 222) } + + def replace_mscharge_and_shared_ownership_values(export_file) + export_file.sub!("", "1") + export_file.sub!("", "321.0") + export_file.sub!("", "1") + export_file.sub!("", "222.0") + export_file.sub!("100.0", "") + export_file.sub!("1", "") + + export_file.sub!("8", "30") + export_file.sub!("", "2") + export_file.sub!("10000.0", "") + export_file.sub!("0", "1") + export_file.sub!("SW1A", "") + export_file.sub!("1AA", "") + export_file.sub!("E09000033", "") + export_file.sub!("1", "") + export_file.sub!("2", "1") + export_file.sub!("1", "0") + export_file.sub!("Westminster", "") + end + + it "exports mscharge fields as hasmscharge and mscharge" do + expected_content = replace_entity_ids(sales_log, xml_export_file.read) + expected_content = replace_mscharge_and_shared_ownership_values(expected_content) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_sales_logs + end + end + end + end +end From 87bf3c81c1dd9b04f42061a7804525e8e1c697d1 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:48:44 +0000 Subject: [PATCH 21/31] Remove care home fields from 2025 export (#2975) --- .../exports/lettings_log_export_constants.rb | 5 + .../exports/lettings_log_export_service.rb | 3 +- .../exports/general_needs_log_25_26.xml | 176 ++++++++++++++++++ .../lettings_log_export_service_spec.rb | 32 ++++ 4 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 spec/fixtures/exports/general_needs_log_25_26.xml diff --git a/app/services/exports/lettings_log_export_constants.rb b/app/services/exports/lettings_log_export_constants.rb index 3dc47736a..b0298e6ca 100644 --- a/app/services/exports/lettings_log_export_constants.rb +++ b/app/services/exports/lettings_log_export_constants.rb @@ -193,5 +193,10 @@ module Exports::LettingsLogExportConstants PRE_2024_EXPORT_FIELDS = Set[ "national", "offered" +] + + PRE_2025_EXPORT_FIELDS = Set[ + "carehome_charges_value_check", + "chcharge" ] end diff --git a/app/services/exports/lettings_log_export_service.rb b/app/services/exports/lettings_log_export_service.rb index cf3e984ae..c52bf8635 100644 --- a/app/services/exports/lettings_log_export_service.rb +++ b/app/services/exports/lettings_log_export_service.rb @@ -142,7 +142,8 @@ module Exports pattern_age.match(field_name) || !EXPORT_FIELDS.include?(field_name) || (lettings_log.form.start_year_2024_or_later? && PRE_2024_EXPORT_FIELDS.include?(field_name)) || - (!lettings_log.form.start_year_2024_or_later? && POST_2024_EXPORT_FIELDS.include?(field_name)) + (!lettings_log.form.start_year_2024_or_later? && POST_2024_EXPORT_FIELDS.include?(field_name)) || + (lettings_log.form.start_year_2025_or_later? && PRE_2025_EXPORT_FIELDS.include?(field_name)) end def build_export_xml(lettings_logs) diff --git a/spec/fixtures/exports/general_needs_log_25_26.xml b/spec/fixtures/exports/general_needs_log_25_26.xml new file mode 100644 index 000000000..57caaad28 --- /dev/null +++ b/spec/fixtures/exports/general_needs_log_25_26.xml @@ -0,0 +1,176 @@ + + +
+ 2 + BZ737 + 35 + F + 2 + 6 + 0 + 2 + 32 + M + 6 + + + + + + + + + + + + + + + + + + + 1 + 4 + 4 + 1 + 1 + 2 + 1 + 5 + 4 + A1 1AA + 6 + 7 + 3 + 1 + 268 + 1 + 1 + 2 + 2 + 7 + AA1 1AA + 1 + 0 + 1 + 0 + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + + + + 4 + 123 + E09000033 + E07000105 + 6 + 1 + 2022-05-05T10:36:49+01:00 + 0 + 2025-04-03T00:00:00+01:00 + 1 + 2 + 1 + 2021-11-03T00:00:00+00:00 + 2 + 1 + 7 + 0 + 0 + 2 + 0 + 2 + 200.0 + 50.0 + 40.0 + 35.0 + 325.0 + 12.0 + 0 + 1 + 0 + 100.0 + 25.0 + 20.0 + 17.5 + 162.5 + 6.0 + 0 + 1 + + 2 + P + + + + + + + + 2 + + 3 + + 4 + 2 + 1064 + 1 + 1 + 1 + 1 + 1, Test Street + + Test Town + + + 2 + + + + + 0 + 826 + address line 1 as entered + address line 2 as entered + town or city as entered + county as entered + AB1 2CD + la as entered + {id} + {owning_org_id} + {owning_org_name} + 1234 + {managing_org_id} + {managing_org_name} + 1234 + 2025-04-03T00:00:00+01:00 + 2025-04-03T00:00:00+01:00 + {log_id} + test1@example.com + test1@example.com + + 2 + 1 + +
diff --git a/spec/services/exports/lettings_log_export_service_spec.rb b/spec/services/exports/lettings_log_export_service_spec.rb index 12e3809f0..600590e71 100644 --- a/spec/services/exports/lettings_log_export_service_spec.rb +++ b/spec/services/exports/lettings_log_export_service_spec.rb @@ -448,6 +448,38 @@ RSpec.describe Exports::LettingsLogExportService do end end end + + context "with 25/26 collection period" do + let(:start_time) { Time.zone.local(2025, 4, 3) } + + before do + Timecop.freeze(start_time) + Singleton.__init__(FormHandler) + end + + after do + Timecop.unfreeze + Singleton.__init__(FormHandler) + end + + context "and one lettings log is available for export" do + let!(:lettings_log) { FactoryBot.create(:lettings_log, :completed, startdate: Time.zone.local(2025, 4, 3), assigned_to: user, age1: 35, sex1: "F", age2: 32, sex2: "M", ppostcode_full: "A1 1AA", nationality_all_group: 13, propcode: "123", postcode_full: "SE2 6RT", tenancycode: "BZ737", voiddate: Time.zone.local(2021, 11, 3), mrcdate: Time.zone.local(2022, 5, 5, 10, 36, 49), tenancylength: 5, underoccupation_benefitcap: 4, creation_method: 2, bulk_upload_id: 1, address_line1_as_entered: "address line 1 as entered", address_line2_as_entered: "address line 2 as entered", town_or_city_as_entered: "town or city as entered", county_as_entered: "county as entered", postcode_full_as_entered: "AB1 2CD", la_as_entered: "la as entered", manual_address_entry_selected: false, uprn: "1", uprn_known: 1) } + let(:expected_zip_filename) { "core_2025_2026_apr_mar_f0001_inc0001.zip" } + let(:expected_data_filename) { "core_2025_2026_apr_mar_f0001_inc0001_pt001.xml" } + let(:xml_export_file) { File.open("spec/fixtures/exports/general_needs_log_25_26.xml", "r:UTF-8") } + + it "generates an XML export file with the expected content within the ZIP file" do + expected_content = replace_entity_ids(lettings_log, xml_export_file.read) + expect(storage_service).to receive(:write_file).with(expected_zip_filename, any_args) do |_, content| + entry = Zip::File.open_buffer(content).find_entry(expected_data_filename) + expect(entry).not_to be_nil + expect(entry.get_input_stream.read).to eq(expected_content) + end + + export_service.export_xml_lettings_logs + end + end + end end context "when exporting a supported housing lettings logs in XML" do From a293355efeb1c7b8c8d412e3d17121ea11868288 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:07:50 +0000 Subject: [PATCH 22/31] Update address logic for queries with non-digit characters (#2998) * Update condition for queries with non-digit characters * Remove redundant route * Add and update address search tests * Update js disabled message --- app/controllers/address_search_controller.rb | 4 +- .../form/_address_search_question.html.erb | 2 +- config/routes.rb | 1 - .../address_search_controller_spec.rb | 88 ++++++++++++++++--- 4 files changed, 79 insertions(+), 16 deletions(-) diff --git a/app/controllers/address_search_controller.rb b/app/controllers/address_search_controller.rb index 74cda65c2..f1d834a11 100644 --- a/app/controllers/address_search_controller.rb +++ b/app/controllers/address_search_controller.rb @@ -18,8 +18,8 @@ class AddressSearchController < ApplicationController presenter = UprnDataPresenter.new(service.result) render json: [{ text: presenter.address, value: presenter.uprn }] end - elsif query.match?(/[a-zA-Z]/) - # Query contains letters, assume it's an address + elsif query.match?(/\D/) + # Query contains any non-digit characters, assume it's an address service = AddressClient.new(query, { minmatch: 0.2 }) service.call diff --git a/app/views/form/_address_search_question.html.erb b/app/views/form/_address_search_question.html.erb index ea30be718..76b39709a 100644 --- a/app/views/form/_address_search_question.html.erb +++ b/app/views/form/_address_search_question.html.erb @@ -17,7 +17,7 @@ <%= question.answer_selected?(@log, answer) ? "selected" : "" %>><%= answer.name || answer.resource %> <% end %> <% else %> - + <% end %> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 304d54ef0..6b1b6458b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -40,7 +40,6 @@ Rails.application.routes.draw do get "/service-moved", to: "maintenance#service_moved" get "/service-unavailable", to: "maintenance#service_unavailable" get "/address-search", to: "address_search#index" - get "/address-search/current", to: "address_search#current" get "/address-search/manual-input/:log_type/:log_id", to: "address_search#manual_input", as: "address_manual_input" get "/address-search/search-input/:log_type/:log_id", to: "address_search#search_input", as: "address_search_input" diff --git a/spec/requests/address_search_controller_spec.rb b/spec/requests/address_search_controller_spec.rb index 7c8523abe..1dffdf8cf 100644 --- a/spec/requests/address_search_controller_spec.rb +++ b/spec/requests/address_search_controller_spec.rb @@ -25,7 +25,7 @@ RSpec.describe AddressSearchController, type: :request do expect(sales_log.town_or_city).to eq(nil) expect(sales_log.la).to eq(nil) - get "/address-search/manual-input/sales_log/#{sales_log.id}" + get address_manual_input_path(log_type: "sales_log", log_id: sales_log.id) sales_log.reload expect(sales_log.manual_address_entry_selected).to eq(true) @@ -58,7 +58,7 @@ RSpec.describe AddressSearchController, type: :request do expect(lettings_log.town_or_city).to eq("London") expect(lettings_log.la).to eq("E09000033") - get "/address-search/manual-input/lettings_log/#{lettings_log.id}" + get address_manual_input_path(log_type: "lettings_log", log_id: lettings_log.id) lettings_log.reload expect(lettings_log.manual_address_entry_selected).to eq(true) @@ -94,7 +94,7 @@ RSpec.describe AddressSearchController, type: :request do expect(lettings_log.town_or_city).to eq(nil) expect(lettings_log.la).to eq(nil) - get "/address-search/search-input/lettings_log/#{lettings_log.id}" + get address_search_input_path(log_type: "lettings_log", log_id: lettings_log.id) lettings_log.reload expect(lettings_log.manual_address_entry_selected).to eq(false) @@ -128,7 +128,7 @@ RSpec.describe AddressSearchController, type: :request do expect(sales_log.town_or_city).to eq("Test Town") expect(sales_log.la).to eq("E09000033") - get "/address-search/search-input/sales_log/#{sales_log.id}" + get address_search_input_path(log_type: "sales_log", log_id: sales_log.id) sales_log.reload expect(sales_log.manual_address_entry_selected).to eq(false) @@ -150,7 +150,7 @@ RSpec.describe AddressSearchController, type: :request do context "and theres no uprn returned" do before do - body = { results: [{ DPA: { "ADDRESS": "1, Test Street", "UPRN": "123" } }] }.to_json + body = { results: [{ DPA: { "ADDRESS": "100, Test Street", "UPRN": "100" } }] }.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: {}) @@ -159,30 +159,94 @@ RSpec.describe AddressSearchController, type: :request do end it "returns the address results" do - get "/address-search?query=100" + get address_search_path, params: { query: "100" } expect(response).to have_http_status(:ok) - expect(response.body).to eq([{ text: "1, Test Street", value: "123" }].to_json) + expect(response.body).to eq([{ text: "100, Test Street", value: "100" }].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") + uprn_body = { results: [{ DPA: { "ADDRESS": "321, 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=321") .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") + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=321") .to_return(status: 200, body: uprn_body, headers: {}) end it "returns the address results" do - get "/address-search?query=100" + get address_search_path, params: { query: "321" } expect(response).to have_http_status(:ok) - expect(response.body).to eq([{ text: "2, Test Street", value: "321" }].to_json) + expect(response.body).to eq([{ text: "321, Test Street", value: "321" }].to_json) end end end end + + describe "GET #index" do + context "when query is nil" do + it "returns a bad request error" do + get address_search_path, params: { query: nil } + expect(response).to have_http_status(:bad_request) + expect(response.body).to include("Query cannot be blank.") + end + end + + context "when query is all numbers and greater than 5 digits" do + before do + address_body = { results: [{ DPA: { "ADDRESS": "Path not taken", UPRN: "111" } }] }.to_json + uprn_body = { results: [{ DPA: { "ADDRESS": "2, Test Street", UPRN: "123456" } }] }.to_json + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/find?key=OS_DATA_KEY&maxresults=10&minmatch=0.2&query=123456") + .to_return(status: 200, body: address_body, headers: {}) + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=123456") + .to_return(status: 200, body: uprn_body, headers: {}) + end + + it "assumes it's a UPRN and returns the address" do + get address_search_path, params: { query: "123456" } + expect(response).to have_http_status(:ok) + expect(response.body).to include("2, Test Street") + expect(response.body).not_to include("Path not taken") + end + end + + context "when query contains any non-digit characters" do + before do + address_body = { results: [{ DPA: { "ADDRESS": "70, Test Street", UPRN: "123777" } }] }.to_json + uprn_body = { results: [{ DPA: { "ADDRESS": "Path not taken", UPRN: "111" } }] }.to_json + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/find?key=OS_DATA_KEY&maxresults=10&minmatch=0.2&query=70,") + .to_return(status: 200, body: address_body, headers: {}) + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=70,") + .to_return(status: 200, body: uprn_body, headers: {}) + end + + it "assumes it's an address and returns the address results" do + get address_search_path, params: { query: "70," } + expect(response).to have_http_status(:ok) + expect(response.body).to include("70, Test Street") + expect(response.body).not_to include("Path not taken") + end + end + + context "when query is ambiguous" do + before do + address_body = { results: [{ DPA: { "ADDRESS": "111, Test Street", UPRN: "123777" } }] }.to_json + uprn_body = { results: [{ DPA: { "ADDRESS": "70 Bean Road", UPRN: "111" } }] }.to_json + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/find?key=OS_DATA_KEY&maxresults=10&minmatch=0.2&query=111") + .to_return(status: 200, body: address_body, headers: {}) + WebMock.stub_request(:get, "https://api.os.uk/search/places/v1/uprn?dataset=DPA,LPI&key=OS_DATA_KEY&uprn=111") + .to_return(status: 200, body: uprn_body, headers: {}) + end + + it "uses both APIs and merges results" do + get address_search_path, params: { query: "111" } + expect(response).to have_http_status(:ok) + expect(response.body).to include("111, Test Street") + expect(response.body).to include("70 Bean Road") + end + end + end end From 0e919b0f78c06bb4850b483cf70f2480bc3035cb Mon Sep 17 00:00:00 2001 From: carolynbarker <8038496+carolynbarker@users.noreply.github.com> Date: Tue, 18 Mar 2025 12:00:37 +0000 Subject: [PATCH 23/31] Escape html in tests to handle names with punctuation (#3002) Co-authored-by: Carolyn --- spec/helpers/tab_nav_helper_spec.rb | 4 ++-- spec/requests/bulk_upload_lettings_results_controller_spec.rb | 2 +- spec/requests/bulk_upload_sales_results_controller_spec.rb | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/helpers/tab_nav_helper_spec.rb b/spec/helpers/tab_nav_helper_spec.rb index bd29f4c46..71fd4f9a8 100644 --- a/spec/helpers/tab_nav_helper_spec.rb +++ b/spec/helpers/tab_nav_helper_spec.rb @@ -16,7 +16,7 @@ RSpec.describe TabNavHelper do describe "#org_cell" do it "returns the users org name and role separated by a newline character" do expected_html = "#{organisation.name}\nData provider" - expect(org_cell(current_user)).to match(expected_html) + expect(CGI.unescapeHTML(org_cell(current_user))).to match(expected_html) end end @@ -30,7 +30,7 @@ RSpec.describe TabNavHelper do describe "#scheme_cell" do it "returns the scheme link service name and primary user group separated by a newline character" do expected_html = "#{scheme.service_name}\nScheme" - expect(scheme_cell(scheme)).to match(expected_html) + expect(CGI.unescapeHTML(scheme_cell(scheme))).to match(expected_html) end end end diff --git a/spec/requests/bulk_upload_lettings_results_controller_spec.rb b/spec/requests/bulk_upload_lettings_results_controller_spec.rb index 3c84487ac..3416b6da9 100644 --- a/spec/requests/bulk_upload_lettings_results_controller_spec.rb +++ b/spec/requests/bulk_upload_lettings_results_controller_spec.rb @@ -138,7 +138,7 @@ RSpec.describe BulkUploadLettingsResultsController, type: :request do get "/lettings-logs/bulk-upload-results/#{bulk_upload.id}/summary" expect(response.body).to include("This error report is out of date.") - expect(response.body).to include("Some logs in this upload are assigned to #{other_user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") + expect(CGI.unescapeHTML(response.body)).to include("Some logs in this upload are assigned to #{other_user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") end end diff --git a/spec/requests/bulk_upload_sales_results_controller_spec.rb b/spec/requests/bulk_upload_sales_results_controller_spec.rb index e58303d68..2236475fa 100644 --- a/spec/requests/bulk_upload_sales_results_controller_spec.rb +++ b/spec/requests/bulk_upload_sales_results_controller_spec.rb @@ -30,7 +30,7 @@ RSpec.describe BulkUploadSalesResultsController, type: :request do get "/sales-logs/bulk-upload-results/#{bulk_upload.id}/summary" expect(response.body).to include("This error report is out of date.") - expect(response.body).to include("Some logs in this upload are assigned to #{user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") + expect(CGI.unescapeHTML(response.body)).to include("Some logs in this upload are assigned to #{user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") end end @@ -113,7 +113,7 @@ RSpec.describe BulkUploadSalesResultsController, type: :request do get "/sales-logs/bulk-upload-results/#{bulk_upload.id}/summary" expect(response.body).to include("This error report is out of date.") - expect(response.body).to include("Some logs in this upload are assigned to #{other_user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") + expect(CGI.unescapeHTML(response.body)).to include("Some logs in this upload are assigned to #{other_user.name}, who has moved to a different organisation since this file was uploaded. Upload the file again to get an accurate error report.") end end From b20138b83a98e4489584065149a7c14601a061c6 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 19 Mar 2025 12:43:08 +0000 Subject: [PATCH 24/31] CLDC-3928 Update logs with manually entered address showing the property information as incomplete (#3003) * set renewal ppostcode on postcode change * update test * Update factory bot and set uprn_selection to uprn as in derived fields * Revert "update test" This reverts commit 3b34cd0086d1c18bf8ed5ca7a698d4fbd5c1b8f6. * Revert "set renewal ppostcode on postcode change" This reverts commit d311c8e8ad6037157715ec2ec717b21b1c368328. * Rake task and tests * Lint * Update tests * Remove flaky behaviour * Update rake task with error logging * Revert "Remove flaky behaviour" This reverts commit d51a03f88e55b46fddba3a767acf8c921a05354b. * Try to prevent flaky test behaviour * Check status before and after change * Do not update logs without any address fields yet entered * Rename trait * Update query * Empty line --------- Co-authored-by: Carolyn --- ...ddress_entry_selected_prexisting_logs.rake | 48 +++++++ spec/factories/lettings_log.rb | 35 ++++- spec/factories/sales_log.rb | 35 ++++- ...ess_entry_selected_prexisting_logs_spec.rb | 121 ++++++++++++++++++ 4 files changed, 237 insertions(+), 2 deletions(-) create mode 100644 lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake create mode 100644 spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb diff --git a/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake b/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake new file mode 100644 index 000000000..96e88e080 --- /dev/null +++ b/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake @@ -0,0 +1,48 @@ +namespace :bulk_update do + desc "Update logs with specific criteria and set manual_address_entry_selected to true" + task update_manual_address_entry_selected: :environment do + updated_lettings_logs_count = 0 + updated_sales_logs_count = 0 + lettings_logs = LettingsLog.filter_by_year(2024) + .where(status: %w[in_progress completed]) + .where(needstype: 1, manual_address_entry_selected: false, uprn: nil) + .where("(address_line1 IS NOT NULL AND address_line1 != '') OR (address_line2 IS NOT NULL AND address_line2 != '') OR (town_or_city IS NOT NULL AND town_or_city != '') OR (county IS NOT NULL AND county != '') OR (postcode_full IS NOT NULL AND postcode_full != '')") + + lettings_logs.find_each do |log| + status_pre_change = log.status + log.manual_address_entry_selected = true + if log.save + updated_lettings_logs_count += 1 + else + Rails.logger.info "Could not save changes to lettings log #{log.id}" + end + status_post_change = log.status + unless status_pre_change == status_post_change + Rails.logger.info "Status changed from #{status_pre_change} to #{status_post_change} for lettings log #{log.id}" + end + end + + puts "#{updated_lettings_logs_count} lettings logs updated." + + sales_logs = SalesLog.filter_by_year(2024) + .where(status: %w[in_progress completed]) + .where(manual_address_entry_selected: false, uprn: nil) + .where("(address_line1 IS NOT NULL AND address_line1 != '') OR (address_line2 IS NOT NULL AND address_line2 != '') OR (town_or_city IS NOT NULL AND town_or_city != '') OR (county IS NOT NULL AND county != '') OR (postcode_full IS NOT NULL AND postcode_full != '')") + + sales_logs.find_each do |log| + status_pre_change = log.status + log.manual_address_entry_selected = true + if log.save + updated_sales_logs_count += 1 + else + Rails.logger.info "Could not save changes to sales log #{log.id}" + end + status_post_change = log.status + unless status_pre_change == status_post_change + Rails.logger.info "Status changed from #{status_pre_change} to #{status_post_change} for sales log #{log.id}" + end + end + + puts "#{updated_sales_logs_count} sales logs updated." + end +end diff --git a/spec/factories/lettings_log.rb b/spec/factories/lettings_log.rb index ad81bca5d..62cc94a14 100644 --- a/spec/factories/lettings_log.rb +++ b/spec/factories/lettings_log.rb @@ -172,7 +172,7 @@ FactoryBot.define do if log.startdate >= Time.zone.local(2024, 4, 1) log.nationality_all_group = 826 log.uprn = evaluator.uprn || "10033558653" - log.uprn_selection = evaluator.uprn_selection || "10033558653" + log.uprn_selection = evaluator.uprn_selection || evaluator.uprn || "10033558653" end end end @@ -220,5 +220,38 @@ FactoryBot.define do instance.save!(validate: false) end end + trait :completed_without_uprn do + completed + manual_address_entry_selected { false } + after(:build) do |log| + log.uprn = nil + log.uprn_selection = nil + log.uprn_known = 0 + end + + after(:build) do |log| + log.address_line1 = "1 Test Street" + log.address_line2 = "Testville" + log.county = "Testshire" + log.town_or_city = "Testford" + log.postcode_full = "SW1 1AA" + end + end + trait :inprogress_without_address_fields do + completed + manual_address_entry_selected { false } + after(:build) do |log| + log.uprn = nil + log.uprn_selection = nil + log.uprn_known = 0 + log.address_line1 = nil + log.address_line2 = nil + log.county = nil + log.town_or_city = nil + log.postcode_full = nil + log.address_line1_input = nil + log.postcode_full_input = nil + end + end end end diff --git a/spec/factories/sales_log.rb b/spec/factories/sales_log.rb index 856a6d7e1..a2e3f7d4c 100644 --- a/spec/factories/sales_log.rb +++ b/spec/factories/sales_log.rb @@ -173,7 +173,7 @@ FactoryBot.define do log.nationality_all_group = 826 log.nationality_all_buyer2_group = 826 log.uprn = evaluator.uprn || "10033558653" - log.uprn_selection = evaluator.uprn_selection || "10033558653" + log.uprn_selection = evaluator.uprn_selection || evaluator.uprn || "10033558653" end if log.saledate >= Time.zone.local(2025, 4, 1) log.relat2 = "X" if log.relat2 == "C" @@ -235,6 +235,39 @@ FactoryBot.define do instance.save!(validate: false) end end + trait :completed_without_uprn do + completed + manual_address_entry_selected { false } + after(:build) do |log| + log.uprn = nil + log.uprn_selection = nil + log.uprn_known = 0 + end + + after(:build) do |log| + log.address_line1 = "1 Test Street" + log.address_line2 = "Testville" + log.county = "Testshire" + log.town_or_city = "Testford" + log.postcode_full = "SW1 1AA" + end + end + trait :inprogress_without_address_fields do + completed + manual_address_entry_selected { false } + after(:build) do |log| + log.uprn = nil + log.uprn_selection = nil + log.uprn_known = 0 + log.address_line1 = nil + log.address_line2 = nil + log.county = nil + log.town_or_city = nil + log.postcode_full = nil + log.address_line1_input = nil + log.postcode_full_input = nil + end + end trait :export do purchid { "123" } ownershipsch { 2 } diff --git a/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb b/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb new file mode 100644 index 000000000..9a9e81386 --- /dev/null +++ b/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb @@ -0,0 +1,121 @@ +require "rails_helper" +require "rake" + +RSpec.describe "bulk_update:update_manual_address_entry_selected", type: :task do + let(:task) { Rake::Task["bulk_update:update_manual_address_entry_selected"] } + + let(:lettings_log_uprn_entered) do + build(:lettings_log, :completed, startdate: Time.zone.local(2024, 6, 1), needstype: 1, manual_address_entry_selected: false) + end + + let(:lettings_log_uprn_found) do + build(:lettings_log, :completed, startdate: Time.zone.local(2024, 9, 1), needstype: 1, manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") + end + + let(:lettings_log_address_fields_not_entered) do + build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 9, 1), needstype: 1) + end + + let(:lettings_log_address_manually_entered) do + build(:lettings_log, :completed_without_uprn, startdate: Time.zone.local(2024, 12, 1), needstype: 1) + end + + let(:sales_log_uprn_entered) do + build(:sales_log, :completed, saledate: Time.zone.local(2024, 12, 1), manual_address_entry_selected: false) + end + + let(:sales_log_uprn_found) do + build(:sales_log, :completed, saledate: Time.zone.local(2024, 7, 1), manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") + end + + let(:sales_log_address_fields_not_entered) do + build(:sales_log, :inprogress_without_address_fields, saledate: Time.zone.local(2024, 12, 30)) + end + + let(:sales_log_address_manually_entered) do + build(:sales_log, :completed_without_uprn, saledate: Time.zone.local(2024, 12, 30)) + end + + before do + Rake.application.rake_require("tasks/update_manual_address_entry_selected_prexisting_logs") + Rake::Task.define_task(:environment) + end + + context "when running the task" do + context "when logs do not meet the criteria" do + before do + lettings_log_uprn_found.save!(validate: false) + lettings_log_uprn_entered.save!(validate: false) + lettings_log_address_fields_not_entered.save!(validate: false) + sales_log_uprn_found.save!(validate: false) + sales_log_uprn_entered.save!(validate: false) + sales_log_address_fields_not_entered.save!(validate: false) + end + + it "does not update logs with a UPRN entered" do + task.invoke + lettings_log_uprn_entered.reload + sales_log_uprn_entered.reload + expect(lettings_log_uprn_entered.manual_address_entry_selected).to be false + expect(lettings_log_uprn_entered.uprn).to eq("10033558653") + expect(sales_log_uprn_entered.manual_address_entry_selected).to be false + expect(sales_log_uprn_entered.uprn).to eq("10033558653") + end + + it "does not update logs with a UPRN found" do + task.invoke + lettings_log_uprn_found.reload + sales_log_uprn_found.reload + expect(lettings_log_uprn_found.manual_address_entry_selected).to be false + expect(lettings_log_uprn_found.uprn).to eq("10033558653") + expect(sales_log_uprn_found.manual_address_entry_selected).to be false + expect(sales_log_uprn_found.uprn).to eq("10033558653") + end + + it "does not update logs with no UPRN or address fields entered" do + task.invoke + lettings_log_address_fields_not_entered.reload + sales_log_address_fields_not_entered.reload + expect(lettings_log_address_fields_not_entered.manual_address_entry_selected).to be false + expect(sales_log_address_fields_not_entered.manual_address_entry_selected).to be false + end + end + + context "when logs do meet the criteria" do + before do + lettings_log_address_manually_entered.manual_address_entry_selected = false + lettings_log_address_manually_entered.save!(validate: false) + sales_log_address_manually_entered.manual_address_entry_selected = false + sales_log_address_manually_entered.save!(validate: false) + end + + it "updates logs with an address manually entered" do + expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be false + expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") + expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") + expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + expect(sales_log_address_manually_entered.manual_address_entry_selected).to be false + expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(sales_log_address_manually_entered.address_line2).to eq("Testville") + expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") + expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + + task.invoke + lettings_log_address_manually_entered.reload + sales_log_address_manually_entered.reload + + expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be true + expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") + expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") + expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + expect(sales_log_address_manually_entered.manual_address_entry_selected).to be true + expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(sales_log_address_manually_entered.address_line2).to eq("Testville") + expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") + expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + end + end + end +end From 4ec01d5fee5429051b3a6d2aded086a81c651ff9 Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:59:39 +0000 Subject: [PATCH 25/31] CLDC-3919: Sales BU Decimal numbers rounding errors (#2987) * Update discount attribute to be saved as a float * Equity fields as decimals * Stairbought and stairowned fields as decimals * mrentprestaircasing as decimal * value fields as decimal * deposit fields as decimal * cashdis as decimal * mscharge fields as decimal * mortgage fields as decimal * Update 2024 value fields * Update 2024 mortgage fields * Update 2024 deposit fields * Update 2024 cashdis field * Update 2024 stairbought and stairowned fields * Update 2024 equity field * Update 2024 discount field * Update 2024 mscharge fields (2/3) --- .../bulk_upload/sales/year2024/row_parser.rb | 32 +++++++++---------- .../bulk_upload/sales/year2025/row_parser.rb | 30 ++++++++--------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index 5f066697c..a613a118c 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/app/services/bulk_upload/sales/year2024/row_parser.rb @@ -252,8 +252,8 @@ class BulkUpload::Sales::Year2024::RowParser attribute :field_84, :integer attribute :field_85, :integer attribute :field_86, :integer - attribute :field_87, :integer - attribute :field_88, :integer + attribute :field_87, :decimal + attribute :field_88, :decimal attribute :field_89, :integer attribute :field_90, :integer @@ -268,40 +268,40 @@ class BulkUpload::Sales::Year2024::RowParser attribute :field_99, :integer attribute :field_100, :integer - attribute :field_101, :integer - attribute :field_102, :integer + attribute :field_101, :decimal + attribute :field_102, :decimal attribute :field_103, :integer - attribute :field_104, :integer + attribute :field_104, :decimal attribute :field_105, :integer attribute :field_106, :string attribute :field_107, :integer attribute :field_108, :integer - attribute :field_109, :integer - attribute :field_110, :integer + attribute :field_109, :decimal + attribute :field_110, :decimal attribute :field_111, :decimal attribute :field_112, :decimal attribute :field_113, :integer - attribute :field_114, :integer + attribute :field_114, :decimal attribute :field_115, :integer - attribute :field_116, :integer + attribute :field_116, :decimal attribute :field_117, :integer - attribute :field_118, :integer + attribute :field_118, :decimal attribute :field_119, :integer attribute :field_120, :string attribute :field_121, :integer attribute :field_122, :integer - attribute :field_123, :integer - attribute :field_124, :integer - attribute :field_125, :integer + attribute :field_123, :decimal + attribute :field_124, :decimal + attribute :field_125, :decimal attribute :field_126, :integer - attribute :field_127, :integer + attribute :field_127, :decimal attribute :field_128, :integer attribute :field_129, :integer - attribute :field_130, :integer - attribute :field_131, :integer + attribute :field_130, :decimal + attribute :field_131, :decimal validates :field_4, presence: { diff --git a/app/services/bulk_upload/sales/year2025/row_parser.rb b/app/services/bulk_upload/sales/year2025/row_parser.rb index 0de492e6f..886b3e928 100644 --- a/app/services/bulk_upload/sales/year2025/row_parser.rb +++ b/app/services/bulk_upload/sales/year2025/row_parser.rb @@ -236,19 +236,19 @@ class BulkUpload::Sales::Year2025::RowParser attribute :field_83, :integer attribute :field_84, :integer attribute :field_85, :integer - attribute :field_86, :integer - attribute :field_87, :integer + attribute :field_86, :decimal + attribute :field_87, :decimal attribute :field_88, :integer - attribute :field_89, :integer + attribute :field_89, :decimal attribute :field_90, :integer - attribute :field_91, :integer - attribute :field_92, :integer + attribute :field_91, :decimal + attribute :field_92, :decimal attribute :field_93, :decimal attribute :field_94, :decimal attribute :field_95, :decimal - attribute :field_96, :integer - attribute :field_97, :integer + attribute :field_96, :decimal + attribute :field_97, :decimal attribute :field_98, :integer attribute :field_99, :integer attribute :field_100, :integer @@ -258,22 +258,22 @@ class BulkUpload::Sales::Year2025::RowParser attribute :field_104, :integer attribute :field_105, :integer attribute :field_106, :integer - attribute :field_107, :integer - attribute :field_108, :integer + attribute :field_107, :decimal + attribute :field_108, :decimal attribute :field_109, :integer - attribute :field_110, :integer + attribute :field_110, :decimal attribute :field_111, :decimal attribute :field_112, :integer - attribute :field_113, :integer + attribute :field_113, :decimal attribute :field_114, :integer - attribute :field_115, :integer + attribute :field_115, :decimal attribute :field_116, :integer - attribute :field_117, :integer + attribute :field_117, :decimal attribute :field_118, :integer attribute :field_119, :integer - attribute :field_120, :integer - attribute :field_121, :integer + attribute :field_120, :decimal + attribute :field_121, :decimal validates :field_1, presence: { From 3b291a9b92fd52be9612e668bf7648089a89d79c Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:58:48 +0000 Subject: [PATCH 26/31] Add context and architecture diagrams (#2999) * Add context and architecture diagrams * lint * Update diagrams * Add source for diagrams, link context diagram --- docs/diagrams.md | 111 +++++++++++++++++++++++++++ docs/images/architecture_diagram.png | Bin 0 -> 293060 bytes docs/images/context_diagram.png | Bin 0 -> 114842 bytes docs/infrastructure.md | 3 + 4 files changed, 114 insertions(+) create mode 100644 docs/diagrams.md create mode 100644 docs/images/architecture_diagram.png create mode 100644 docs/images/context_diagram.png diff --git a/docs/diagrams.md b/docs/diagrams.md new file mode 100644 index 000000000..69db985ce --- /dev/null +++ b/docs/diagrams.md @@ -0,0 +1,111 @@ +--- +title: PlanUML source for diagrams +--- + +{% plantuml %} +!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v19.0/dist +!include AWSPuml/AWSCommon.puml +!include AWSPuml/Groups/VPC.puml +!include AWSPuml/Groups/GenericOrange.puml +!include AWSPuml/Storage/SimpleStorageService.puml +!include AWSPuml/AWSSimplified.puml +!include AWSPuml/Groups/PublicSubnet.puml +!include AWSPuml/Groups/PrivateSubnet.puml +!include AWSPuml/Containers/ElasticContainerService.puml +!include AWSPuml/Database/RDS.puml +!include AWSPuml/Database/ElastiCacheElastiCacheforRedis.puml +!include AWSPuml/NetworkingContentDelivery/CloudFront.puml +!include AWSPuml/NetworkingContentDelivery/ElasticLoadBalancingApplicationLoadBalancer.puml +!include AWSPuml/Containers/ElasticContainerRegistry.puml +!include AWSPuml/Groups/AWSAccount.puml + +' External Systems +actor User + +' Main System: Meta Environment +AWSAccountGroup(meta, "Meta Environment") { +ElasticContainerRegistry(ecr, "ECR (Elastic Container Registry) - Shared between environments", "ECR (Elastic Container Registry)","") +} + +VPCGroup(vpc) { +PublicSubnetGroup(public_subnet, "Public subnet") { +ElasticLoadBalancingApplicationLoadBalancer(loadBalancer, "Load Balancer", "Load Balancer", "") +} +PrivateSubnetGroup(private_subnet, "Private subnet") { +GenericOrangeGroup(fargateTasks, "ECS Fargate Tasks") { +ElasticContainerService(App, "App", "Container", "") +ElasticContainerService(Sidekiq, "Sidekiq", "Container", "") +ElasticContainerService(AdHocTasks, "Ad-hoc Tasks", "Container", "") +} + + RDS(rdsDatabase, "RDS", "RDS","") + ElastiCacheElastiCacheforRedis(redis, "ElastiCache for Redis", "Redis","") + +} +} +' Networking + +SimpleStorageService(bulkUpload, "Bulk Upload", "Bulk upload bucket", "") +SimpleStorageService(cdsExport, "CDS Export", "CDS export bucket", "") +SimpleStorageService(collectionResources, "Collection resources", "Collection resources bucket", "") +CloudFront(cloudFront, "CloudFront", "CloudFront", "") + +' Relationships +User --> [cloudFront] : Interacts with +[loadBalancer] --> [fargateTasks] : Routes traffic to + +[ecr] --> [fargateTasks] : Pulls Docker images from +[cloudFront] --> [loadBalancer] : Routes traffic to + +[fargateTasks] --> [bulkUpload] : Uploads data to +[fargateTasks] --> [cdsExport] : Exports data to +[fargateTasks] --> [collectionResources] : Reads/writes data to +[fargateTasks] --> [rdsDatabase] : Writes data to +[fargateTasks] --> [redis] : Caches data in + +{% endplantuml %} + +--- + +{% plantuml %} +!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v19.0/dist +!include AWSPuml/AWSCommon.puml +!include AWSPuml/Storage/SimpleStorageService.puml +!include AWSPuml/Groups/GenericOrange.puml +!define SPRITESURL https://raw.githubusercontent.com/plantuml-stdlib/gilbarbara-plantuml-sprites/v1.1/sprites +!define IMAGESSURL https://raw.githubusercontent.com/plantuml-stdlib/gilbarbara-plantuml-sprites/v1.1/pngs +!includeurl SPRITESURL/sentry.puml +!includeurl SPRITESURL/google-analytics.puml +!include AWSPuml/Containers/ElasticContainerService.puml +!include AWSPuml/AWSSimplified.puml + +skinparam actorPadding 15 +skinparam packagePadding 20 +skinparam componentPadding 20 +skinparam rectanglePadding 20 + +rectangle "" as ga +rectangle "" as sentry +rectangle "GOV.UK Notify" as notify +rectangle "OS Places API" as osapi +rectangle "CDS Ingest Pipeline" as cds + +actor "End Users" as Users +actor "Support Users" as SupportUsers + +' Main System: Application Package +package "Application" { +ElasticContainerService(App, "App", "Container", "") +SimpleStorageService(cdsExport, "CDS Export", "CDS export bucket", "") +} + +' Relationships and interactions +Users --> [App] : Provides data, downloads CSVs +SupportUsers --> [App] : Support tasks, file downloads +[App] --> [notify] : Email notifications +[App] --> [sentry] : Alerts +[App] --> [osapi] : Address lookup +[cds] --> [cdsExport] : Downloads data for processing +[App] --> [ga] : Sends analytics data to Google Analytics + +{% endplantuml %} diff --git a/docs/images/architecture_diagram.png b/docs/images/architecture_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..66a02289b2970bf6bdaa869aab69cda0dac84780 GIT binary patch literal 293060 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 F-mNWM}Kat0c zsS7_MYXGedfLFQ|XXFC9M*e&`=XqV=zV1S5TP%+hp(+BupZdpL%%f!h8k@kM-zb4e zy3Q=UXximo2Na3m@7e(T6;c6AkT_F+4n{Y1hH4hvz5UuDub6&rNl0R%XvB)8-L7rg zWtK&6C=~$!@WButj2?RbnvLIbm5TPyqTmj*&06VvBWv-flDiY4ji-rkJ}$q*l?`*4 zs0LszZ5B?;IE<7yb7(3$Kr+ig=?ca%&Iq8$0+3BB+H@LYW$SF|NlQSh%=cz*&R(2# zKO+TtPH!!sl-b|>go^2m+8A4_0yTQIcood`xU;qQ1_I%Rn$a*XMwELtYkC>bYUwlP zs@&P+Noqi-T6n*w5n~jv+n=cX(3Q`ghoVj%VV^lXQG`6l!l=E z85e)Qb~3=+LR$-Lf6pEVpjDqV*W-UI<6mqSg#xjjxnXL^X)u1ajDN|lcP4-sv*a_y ze!F%v2|#H6D_X?=6|EET`LAgG)TaMhtrNqT{{Mv45^cNufQzf49||%6f+8+!Yz)>@ zv=DF$eeZe+PxmDTFDSLQ}Mv+lF@O(J&hcCJBmS?<`^#Xz@xR%QiPWik}KOq z4nR}@Fq+l%(5!NI>1vWm$s5?V_C&;T*i6*y!jV7kFhZcpJyJH<_C_`1E+w_3UF)q4!YtZG|M{a-Y3XZGBLANWJ}@1mhpR}+AP*0;BV z;3;D8uj0vO|W11YiUI@)>CN=K2O$53XG5#}gU%hB0hdAMaRq zl{>BP2379{eH$5s1Ccd{{X!=%auht>Ez54XI>#iu8Sp{C$!c>??`T$UiY(h%Lfd)L z7dp-k zyE`B8R{=3s!y$59ucBibh;GxS0$E^pgx7})vnZBK-Lf-oMDp(VrFLm(SlTlsyy7>ck&Zi;SgYjA-a{WWa|(hCXlq+x3qQxQM)dD zY$z05^Sw;oSU!HZM)Bt}(OgyplgQrpDJ_`IcAq-AQMTuHRuIbVsBF@YY6=L=w6ac((i9e5R!pS1_uW<+z;1}kJdMVU^>ltyt6ZBUspWs9lq%)-Ze9ZmkiTOU8I zMpYlo+M?rmiTF|f(WuCGb%TOc)Su>#=BgQ1;gte@1eDi^1UE#VMBh&t zOyx=B8Bwy+^E^T%lGB0pzJ*3)7%seW5@kmI<`68wC=zPniu8wuL6P< z<|^~OZKC51A}IFSK-EqmL!8je8}YymK5OaGAL?JHLj~A?BnIr$F)Pv)(_w`P-wSb* zs9MRhls*mdV4k7u)x0^fj{;6>!RwIYeF+wTy-pxdi?@-kSd1*81!AdN`-e;qI@$1c zWVe>QN-=J|42T$cj}H*jsO9XiiW@sajQ&u*xYp+uRXkA#!v0Vf)s=%i#I54D>Me7k z+n{ljn)#);<+*3~{h^S<0SFBc*s-X2RxRtS2Zm7bG>RM}MCR{GP@xqf2ni^eg83k- zQ=Et_%K{kHhAyXW%>W>(+eM+sNu;5A(i?`#e$9pW(Jm zG;hVbB6A9Nr!=d7WKK~h%|+Cf&QukDi5$x}Thr4$jPV&h2&P6EMU4_+D!X~_07Z?F z`4sLGYe?To=)LZ-?q&-_o!7Hu5j(ZXk|BW=7i?NGn-96RSFIreYA|g|avl4p?i)UI z_tc{2A`13gbt8tZ!Pi`lzv9wqzj}wZSGmKS5FV@15`BqzV_`%z!(i(`s4!}QcPTwt zzbTXkdefMY7O~V@aeq5Y@6e2Znm1>`yvlmGz%y!JkXUob^eh>##x01hk*6t~L zm;i2-%jJoA7QRPTW@dpEFY#i% zXLQGg5j`U^KsR=G~(NkH}yuxmMvp_1Fp*UVWeP?+fyD-4r zZ!y2che%k%LOc!-W-Mo=;VR?@gU|pdsQ9|^$D&?q7hU1B!dtURK7@DMMcPJ?aGSa- z4Lh|WsIIWU&Ev80Lmk`Hm80Rd=a#x{G3rHgmVt0og|-m{F45&{ewhSXV2$N{cP@C2Qcl{+TQyPy0$D4BmoG? z<8_QYKGMtO+Qb#!@YX1Iv}}##VfXy;KJk&RX{@Yl=b#n)B~Lvo?k!pl4A)hN}cthg{22P-xn zxU<11;2aw=hp2C`U^4IatU%;85JU9yq&gQ%&U`7%h0KhN&tf!R@Nlb#!+B#uKXyVW zdwu=*PIb^Z4FL)187UI8(X~> zt1mm%9|Upjv9mrxV-6lWo0yL0Z8xpfj+;b|Hv3tS{TKXkic6r|kZTd<1PQiil{K%LrT> zZKWCPX}HW(v|VN+a@~+?Xg5q%eYBlDEvtu8ssK#m-KENHs5PrDB0KWP^Ke;@eYkbt zM^R1bjOQ5I(D_WFZIi^aIQ1zYou0qz390_U2P>VKpYH=Q&wXF^o(!a>rlx0Qv8a_? z*DIJ*m!%T{{G5of>>T$f3}Xd$6*#+9gd?kZ8X70@pJN5>&Gn;m<0d91cZ%R`H;vd_ z3KtY0sGe`enR9&^ObO2V6>ARJL3@b#69>ARRgKE}1iyUP47xTC^+YUF8pmB-cWx4x zdVMSOwR^wWS{+dNAZE={$gV;yIRoiOisCUx&k4kq}AbeVl zh+nTy6W-34LM;PH>=FRl1d`<$C%70riRb6CdmP)e4VW}e$zX~u*W)TUwd3IPw-7s1 zJZ;2&q@}Nd@ZL;+5|19_quqDLC{pj$G?Bx_-5sD(@URb5Jr35@Vt2)qajrq&hj*)i zBj%x#vOjYKHHqijg^;5qXhfobMrd&!J43n7n^O#<=6p_EkW!1GJbgnWLILDGzM57R z6~t1XP|GKYpg@Fbnq2I4x1xNH{T+R>#py5+U5o74M4sohuY{~aw2k{RRVC8-0K8mT z)j|i@_EFbmsD!gCP?tgD;2{1z?Y>bYwb|V2D^N3FDgz^ma4r(uc?mZbVIOE2xh8^I zNair@{>(sXRf+_PF)V7~a|nF|h2CbMdVPuQv{scTd_d3-z?Kql`4XpfxWpKZfMb0i z8H;{rlGr|hC1R*(FCmiC6zMKXm_~k2gP7B(_0DkXxaC+G7l67E)LDl*8naLA>^L!;cMeRas)MmsDk^trP^sj0>JUAq(athn#K7TAZ*${xv)?Ci zVgO0)uYW*wdMxO#&i{IdzX{~h2~;s3EjkN^6iI-jUd#t0pWmncIDt4R{$r-x@6$#P zfwU1xj|K4coL{7$(7?jp4+uCoRSJKfiIYQTv-D%Gyu;uIPT>hU+1QRgbMKeQ{ac!* z;{i04dy+4P$-13o5$QWA0YbDZ_TBz#bW9Ii08OC*rreKzO9*~(AahKaIsAK?-UevO z#nE>0_k=J82q7S@8v9$C_PzpW`d{JtuW+4dOVa;k;o8CiPTQpJt{96@IB`6n}C2>7Pme;hQ#x+XGFFAylAsbb4WjvJ4FhgV7Ehx_z`scgz7ep=D!h zjMl5O2dE7QdH99=JYOn00aOx)mtkZqYW14N@nj>#*4C9rhwBg#;iJv4V$XJKAV;F` zC|kF3r)=)8WXu_VPRy@so@mB983o#;+@BX@Xh^<|;LMX{xkXla>^Fwe2<%k!qN+ZA zys4J0OC#=2XjwUju~>fIwakm`?~7BMXlBU{1`2hn4#=b0e(gn_b=RmI2XFut^3AT+abd!)k!?eNA&-7{bl1Fe#N4k zb)fBZqtJXbIznr+fW8TwQIe;1eSVz@Koub9vh%{HApPcW=J+E)BFw8*2Wo+i z+mziRCqA{)_k5~CBJF%4#M6BOhi>6vWjE%-x757eN{kUWNN0tgw>!#WYbsn2`b)hT zW6%+l>?y*@Y2GP6`xd}InG0MA1LnoglKee*xB!Hl1GV?4P7eZM+yOx4c=Sy~QnirZ zLJY;rX!?FIH26I(P)1{|+RUfFg&1b&OA43sErNfG3+&MqRAmh=jE9TP@Qo-d8f!g| z40(%DZGKMhKPK1TOv%{{{~ouK86brG^FGYCNYC`OkiJv#vd@E`C(0wvtKGZP#5!)e zBBPU;Q5F0_kvw~EM3;-p$OludFA0IBqH)&g!I>NdZyFH8bs;VIyc3&aRSk?L{+K`k z6El+>(Pec3u;u695>`bMAitqv8^)WBe_?9@V4K6y=C?2{@T`$2a2Ol7e&l0@`SSM} z^@q`A^>%G4=3mkD#Fwf9C;ikYRlvVpdv7Qp6pnMlkAE-tc|fb?q!^4Bmd_XpPzxxl za}G%UUck^N`cyCWQU7-Bg|`4`9bd|=^jo>lya%+ppFVdcBp7#^P6If!)z-qdzgI^? zpjCtzm(*XZ!0;ftdg(!LyJATA>6V>udMlyya+lmBwic`t`d?sEnY=MTdn2B?1bqK;c6$7Dxu$0{^*Nls*zBgEA%5bh5~(kKB$J z%qhFJtgfcNnrHV#S36)eR%xOvABV>F)HDBE*vkR{{>DBDw>owD?Zn@*)b@#_v6oAf zg8Bcz{o=s!LWNMh=k7p7ZK0mlB5H*UwwM4st0&GyWS7d1W2aE?3hM8^lF=HAQ7f^s z)}1Wlz|CQ4X7+;CFEO@#wBUpKsbb_(C)&UX8Q%VRD5l_Pl1lT)1u23jS!%dxeOYx) zk@_=YDHKAvYtE&CM$YqCbHo+V%R^$ntuMQA z;pQA(jL;waK;0jyzw9Stp{*0h)uE!lTS8jFW@*Kg?Kf6h=^{HNL_5ohQ3}iA0dkDU zMH8N0T_3w`6zkgKB7#wRNCnY!7}vX*hSP z0ubOJ14<#MIj`aW%z6hDD7h z%@U%{cCX3L{%EPler@Shot;U{Qm`zDAnZ#}fE0JOZamltTsa!%-oKn=57A{VH#bJy z9po|{nJ@&iEVd5V5lCkl6A7iVHGbaU%8qH9ubSHlb=G9oVM%kH{gC)_G$iY8uEBB; zWwaYci(xYXEETsM{{H0G8rfTK)L?|P(M1HppGk2$(u1U#ZD=BkuC}x2@O;hzd*Evh zu*r!ny|m-EF66TrE4h8)qxq8lXt)f%X)I2Ut?BF%C%8FR$oETW<>Yjax$C&~Gv*>| zX#HGagho`mS=$J%wKNEC9j+6&soYb?(pJ~nu{4L`2_X5xn~96Bzv-{6WBbzP$w%rcB@U~`kYe)+l8r*D?Rz37Wls1`p&~1;l;TA z$UJj5e4U=5FGzSvc?qPu%YkF3le9n8rtnV2nER2rr(+^%L1>~<;<+)D#>Qji*3xoj z+C3fRa4=nkvP67C!rWyjN5Kp0F)%kyZK;LJ$ta& z0hK_-!a;prOB%uH0+hy)ed+EZPrAyNB%SIC>e&8A7Gu5c7gu)cWNbSN%0AdQ^NVx) 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
=FYn$?xn->6eYd}Q{V-iy6>6SF2Q>+g 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 literal 0 HcmV?d00001 diff --git a/docs/images/context_diagram.png b/docs/images/context_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d829920e0c1b2ee5d34d97bd3897cb1cb17fd5f7 GIT binary patch literal 114842 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 z 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

8YxgvX#ei6M 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 X*U) Date: Thu, 20 Mar 2025 11:48:02 +0000 Subject: [PATCH 27/31] Add plantuml gem (#3005) --- docs/Gemfile | 1 + docs/Gemfile.lock | 3 +++ docs/_config.yml | 3 +++ 3 files changed, 7 insertions(+) diff --git a/docs/Gemfile b/docs/Gemfile index 27acded18..3a203d3b3 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -2,6 +2,7 @@ source "https://rubygems.org" group :jekyll_plugins do gem "github-pages" + gem "jekyll-plantuml" end group :development do diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 8abf94d7a..eb3111aa9 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -130,6 +130,8 @@ GEM jekyll-optional-front-matter (0.3.2) jekyll (>= 3.0, < 5.0) jekyll-paginate (1.1.0) + jekyll-plantuml (1.4.2) + jekyll (> 2.0) jekyll-readme-index (0.3.0) jekyll (>= 3.0, < 5.0) jekyll-redirect-from (0.16.0) @@ -261,6 +263,7 @@ PLATFORMS DEPENDENCIES github-pages + jekyll-plantuml webrick BUNDLED WITH diff --git a/docs/_config.yml b/docs/_config.yml index 786d0ab41..31d4a756a 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,3 +10,6 @@ aux_links: - https://core-design-history.herokuapp.com "GitHub": - https://github.com/communitiesuk/submit-social-housing-lettings-and-sales-data +gems: ["jekyll-plantuml"] +plugins: + - jekyll-diagrams From 6cc6f24081e21d4202a576a8297a6bf74c4374a0 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:51:49 +0000 Subject: [PATCH 28/31] Remove plant uml mentions (#3008) * Revert "Add plantuml gem (#3005)" This reverts commit 83b16e7ebd9ed1db04b48e0367ef6bfe04d099e6. * Remove diagrams file --- docs/Gemfile | 1 - docs/Gemfile.lock | 3 -- docs/_config.yml | 3 -- docs/diagrams.md | 111 ---------------------------------------------- 4 files changed, 118 deletions(-) delete mode 100644 docs/diagrams.md diff --git a/docs/Gemfile b/docs/Gemfile index 3a203d3b3..27acded18 100644 --- a/docs/Gemfile +++ b/docs/Gemfile @@ -2,7 +2,6 @@ source "https://rubygems.org" group :jekyll_plugins do gem "github-pages" - gem "jekyll-plantuml" end group :development do diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index eb3111aa9..8abf94d7a 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -130,8 +130,6 @@ GEM jekyll-optional-front-matter (0.3.2) jekyll (>= 3.0, < 5.0) jekyll-paginate (1.1.0) - jekyll-plantuml (1.4.2) - jekyll (> 2.0) jekyll-readme-index (0.3.0) jekyll (>= 3.0, < 5.0) jekyll-redirect-from (0.16.0) @@ -263,7 +261,6 @@ PLATFORMS DEPENDENCIES github-pages - jekyll-plantuml webrick BUNDLED WITH diff --git a/docs/_config.yml b/docs/_config.yml index 31d4a756a..786d0ab41 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,6 +10,3 @@ aux_links: - https://core-design-history.herokuapp.com "GitHub": - https://github.com/communitiesuk/submit-social-housing-lettings-and-sales-data -gems: ["jekyll-plantuml"] -plugins: - - jekyll-diagrams diff --git a/docs/diagrams.md b/docs/diagrams.md deleted file mode 100644 index 69db985ce..000000000 --- a/docs/diagrams.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -title: PlanUML source for diagrams ---- - -{% plantuml %} -!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v19.0/dist -!include AWSPuml/AWSCommon.puml -!include AWSPuml/Groups/VPC.puml -!include AWSPuml/Groups/GenericOrange.puml -!include AWSPuml/Storage/SimpleStorageService.puml -!include AWSPuml/AWSSimplified.puml -!include AWSPuml/Groups/PublicSubnet.puml -!include AWSPuml/Groups/PrivateSubnet.puml -!include AWSPuml/Containers/ElasticContainerService.puml -!include AWSPuml/Database/RDS.puml -!include AWSPuml/Database/ElastiCacheElastiCacheforRedis.puml -!include AWSPuml/NetworkingContentDelivery/CloudFront.puml -!include AWSPuml/NetworkingContentDelivery/ElasticLoadBalancingApplicationLoadBalancer.puml -!include AWSPuml/Containers/ElasticContainerRegistry.puml -!include AWSPuml/Groups/AWSAccount.puml - -' External Systems -actor User - -' Main System: Meta Environment -AWSAccountGroup(meta, "Meta Environment") { -ElasticContainerRegistry(ecr, "ECR (Elastic Container Registry) - Shared between environments", "ECR (Elastic Container Registry)","") -} - -VPCGroup(vpc) { -PublicSubnetGroup(public_subnet, "Public subnet") { -ElasticLoadBalancingApplicationLoadBalancer(loadBalancer, "Load Balancer", "Load Balancer", "") -} -PrivateSubnetGroup(private_subnet, "Private subnet") { -GenericOrangeGroup(fargateTasks, "ECS Fargate Tasks") { -ElasticContainerService(App, "App", "Container", "") -ElasticContainerService(Sidekiq, "Sidekiq", "Container", "") -ElasticContainerService(AdHocTasks, "Ad-hoc Tasks", "Container", "") -} - - RDS(rdsDatabase, "RDS", "RDS","") - ElastiCacheElastiCacheforRedis(redis, "ElastiCache for Redis", "Redis","") - -} -} -' Networking - -SimpleStorageService(bulkUpload, "Bulk Upload", "Bulk upload bucket", "") -SimpleStorageService(cdsExport, "CDS Export", "CDS export bucket", "") -SimpleStorageService(collectionResources, "Collection resources", "Collection resources bucket", "") -CloudFront(cloudFront, "CloudFront", "CloudFront", "") - -' Relationships -User --> [cloudFront] : Interacts with -[loadBalancer] --> [fargateTasks] : Routes traffic to - -[ecr] --> [fargateTasks] : Pulls Docker images from -[cloudFront] --> [loadBalancer] : Routes traffic to - -[fargateTasks] --> [bulkUpload] : Uploads data to -[fargateTasks] --> [cdsExport] : Exports data to -[fargateTasks] --> [collectionResources] : Reads/writes data to -[fargateTasks] --> [rdsDatabase] : Writes data to -[fargateTasks] --> [redis] : Caches data in - -{% endplantuml %} - ---- - -{% plantuml %} -!define AWSPuml https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v19.0/dist -!include AWSPuml/AWSCommon.puml -!include AWSPuml/Storage/SimpleStorageService.puml -!include AWSPuml/Groups/GenericOrange.puml -!define SPRITESURL https://raw.githubusercontent.com/plantuml-stdlib/gilbarbara-plantuml-sprites/v1.1/sprites -!define IMAGESSURL https://raw.githubusercontent.com/plantuml-stdlib/gilbarbara-plantuml-sprites/v1.1/pngs -!includeurl SPRITESURL/sentry.puml -!includeurl SPRITESURL/google-analytics.puml -!include AWSPuml/Containers/ElasticContainerService.puml -!include AWSPuml/AWSSimplified.puml - -skinparam actorPadding 15 -skinparam packagePadding 20 -skinparam componentPadding 20 -skinparam rectanglePadding 20 - -rectangle "" as ga -rectangle "" as sentry -rectangle "GOV.UK Notify" as notify -rectangle "OS Places API" as osapi -rectangle "CDS Ingest Pipeline" as cds - -actor "End Users" as Users -actor "Support Users" as SupportUsers - -' Main System: Application Package -package "Application" { -ElasticContainerService(App, "App", "Container", "") -SimpleStorageService(cdsExport, "CDS Export", "CDS export bucket", "") -} - -' Relationships and interactions -Users --> [App] : Provides data, downloads CSVs -SupportUsers --> [App] : Support tasks, file downloads -[App] --> [notify] : Email notifications -[App] --> [sentry] : Alerts -[App] --> [osapi] : Address lookup -[cds] --> [cdsExport] : Downloads data for processing -[App] --> [ga] : Sends analytics data to Google Analytics - -{% endplantuml %} From 8a07c8f80408a21a320cf99c80d5e7a613e2687c Mon Sep 17 00:00:00 2001 From: Manny Dinssa <44172848+Dinssa@users.noreply.github.com> Date: Thu, 20 Mar 2025 12:56:22 +0000 Subject: [PATCH 29/31] CLDC-3928++ Update logs with manually entered address showing the property information as incomplete (#3004) * set renewal ppostcode on postcode change * update test * Update factory bot and set uprn_selection to uprn as in derived fields * Revert "update test" This reverts commit 3b34cd0086d1c18bf8ed5ca7a698d4fbd5c1b8f6. * Revert "set renewal ppostcode on postcode change" This reverts commit d311c8e8ad6037157715ec2ec717b21b1c368328. * Rake task and tests * Lint * Update tests * Remove flaky behaviour * Update rake task with error logging * Revert "Remove flaky behaviour" This reverts commit d51a03f88e55b46fddba3a767acf8c921a05354b. * Try to prevent flaky test behaviour * Check status before and after change * Do not update logs without any address fields yet entered * Rename trait * Update query * Empty line * Implement postcode fix and log ids of status changed * Add rake task to fix affected logs after tasks first run * Simplify query * Update task and use bulk upload value, additional logging * Update to handle failing save * Update tests * Add bu created log test * Add task reenable * Additional logging * rename --------- Co-authored-by: Carolyn --- ...ddress_entry_selected_prexisting_logs.rake | 177 ++++++++++- ...ess_entry_selected_prexisting_logs_spec.rb | 278 ++++++++++++------ 2 files changed, 352 insertions(+), 103 deletions(-) diff --git a/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake b/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake index 96e88e080..d11dc3219 100644 --- a/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake +++ b/lib/tasks/update_manual_address_entry_selected_prexisting_logs.rake @@ -2,7 +2,21 @@ namespace :bulk_update do desc "Update logs with specific criteria and set manual_address_entry_selected to true" task update_manual_address_entry_selected: :environment do updated_lettings_logs_count = 0 + lettings_postcode_fixed_count = 0 + lettings_postcode_fixed_status_changed_count = 0 + lettings_postcode_not_fixed_status_changed_count = 0 + lettings_postcode_fixed_status_changed_ids = [] + lettings_postcode_not_fixed_status_changed_ids = [] + lettings_updated_without_issue = 0 + updated_sales_logs_count = 0 + sales_postcode_fixed_count = 0 + sales_postcode_fixed_status_changed_count = 0 + sales_postcode_not_fixed_status_changed_count = 0 + sales_postcode_fixed_status_changed_ids = [] + sales_postcode_not_fixed_status_changed_ids = [] + sales_updated_without_issue = 0 + lettings_logs = LettingsLog.filter_by_year(2024) .where(status: %w[in_progress completed]) .where(needstype: 1, manual_address_entry_selected: false, uprn: nil) @@ -13,17 +27,48 @@ namespace :bulk_update do log.manual_address_entry_selected = true if log.save updated_lettings_logs_count += 1 + Rails.logger.info "manual_address_entry_selected updated for lettings log #{log.id}" else - Rails.logger.info "Could not save changes to lettings log #{log.id}" + Rails.logger.info "Could not save manual_address_entry_selected changes to lettings log #{log.id} : #{log.errors.full_messages.join(', ')}" end + + postcode_fixed = false + if log.postcode_full.nil? && log.address_line1 == log.address_line1_input + log.postcode_full = log.postcode_full_input + if log.save + lettings_postcode_fixed_count += 1 + Rails.logger.info "postcode_full updated by address_line1_input for lettings log #{log.id}" + postcode_fixed = true + else + Rails.logger.info "Could not save postcode_full changes to lettings log #{log.id} : #{log.errors.full_messages.join(', ')}" + end + end + + if log.postcode_full.nil? && log.creation_method == "bulk upload" && log.address_line1 == log.address_line1_as_entered + log.postcode_full = log.postcode_full_as_entered + if log.save + lettings_postcode_fixed_count += 1 + Rails.logger.info "postcode_full updated by address_line1_as_entered for lettings log #{log.id}" + postcode_fixed = true + else + Rails.logger.info "Could not save postcode_full changes to lettings log #{log.id} : #{log.errors.full_messages.join(', ')}" + end + end + status_post_change = log.status - unless status_pre_change == status_post_change - Rails.logger.info "Status changed from #{status_pre_change} to #{status_post_change} for lettings log #{log.id}" + if status_pre_change != status_post_change + if postcode_fixed + lettings_postcode_fixed_status_changed_count += 1 + lettings_postcode_fixed_status_changed_ids << log.id + else + lettings_postcode_not_fixed_status_changed_count += 1 + lettings_postcode_not_fixed_status_changed_ids << log.id + end + else + lettings_updated_without_issue += 1 end end - puts "#{updated_lettings_logs_count} lettings logs updated." - sales_logs = SalesLog.filter_by_year(2024) .where(status: %w[in_progress completed]) .where(manual_address_entry_selected: false, uprn: nil) @@ -34,15 +79,129 @@ namespace :bulk_update do log.manual_address_entry_selected = true if log.save updated_sales_logs_count += 1 + Rails.logger.info "manual_address_entry_selected updated for sales log #{log.id}" else - Rails.logger.info "Could not save changes to sales log #{log.id}" + Rails.logger.info "Could not save manual_address_entry_selected changes to sales log #{log.id} : #{log.errors.full_messages.join(', ')}" end + + postcode_fixed = false + if log.postcode_full.nil? && log.address_line1 == log.address_line1_input + log.postcode_full = log.postcode_full_input + if log.save + sales_postcode_fixed_count += 1 + Rails.logger.info "postcode_full updated by address_line1_input for sales log #{log.id}" + postcode_fixed = true + else + Rails.logger.info "Could not save postcode_full changes to sales log #{log.id} : #{log.errors.full_messages.join(', ')}" + end + end + + if log.postcode_full.nil? && log.creation_method == "bulk upload" && log.address_line1 == log.address_line1_as_entered + log.postcode_full = log.postcode_full_as_entered + if log.save + sales_postcode_fixed_count += 1 + Rails.logger.info "postcode_full updated by address_line1_as_entered for sales log #{log.id}" + postcode_fixed = true + else + Rails.logger.info "Could not save postcode_full changes to sales log #{log.id} : #{log.errors.full_messages.join(', ')}" + end + end + status_post_change = log.status - unless status_pre_change == status_post_change - Rails.logger.info "Status changed from #{status_pre_change} to #{status_post_change} for sales log #{log.id}" + if status_pre_change != status_post_change + if postcode_fixed + sales_postcode_fixed_status_changed_count += 1 + sales_postcode_fixed_status_changed_ids << log.id + else + sales_postcode_not_fixed_status_changed_count += 1 + sales_postcode_not_fixed_status_changed_ids << log.id + end + else + sales_updated_without_issue += 1 + end + end + + puts "#{updated_lettings_logs_count} lettings logs were updated." + puts "#{lettings_updated_without_issue} lettings logs were updated without issue." + puts "#{lettings_postcode_fixed_count} lettings logs where postcode fix was applied." + puts "#{lettings_postcode_fixed_status_changed_count} lettings logs with postcode fix and status changed." + puts "#{lettings_postcode_not_fixed_status_changed_count} lettings logs without postcode fix and status changed." + puts "IDs of lettings logs with postcode fix and status changed: [#{lettings_postcode_fixed_status_changed_ids.join(', ')}]" + puts "IDs of lettings logs without postcode fix and status changed: [#{lettings_postcode_not_fixed_status_changed_ids.join(', ')}]" + + lettings_postcode_fixed_org_counts = LettingsLog.where(id: lettings_postcode_fixed_status_changed_ids).group(:owning_organisation_id).count + lettings_postcode_fixed_org_counts.each do |org_id, count| + puts "Org #{org_id}: #{count} logs with postcode fix and status changed." + end + + lettings_postcode_not_fixed_org_counts = LettingsLog.where(id: lettings_postcode_not_fixed_status_changed_ids).group(:owning_organisation_id).count + lettings_postcode_not_fixed_org_counts.each do |org_id, count| + puts "Org #{org_id}: #{count} logs without postcode fix and status changed." + end + + puts "#{updated_sales_logs_count} sales logs were updated." + puts "#{sales_updated_without_issue} sales logs were updated without issue." + puts "#{sales_postcode_fixed_count} sales logs where postcode fix was applied." + puts "#{sales_postcode_fixed_status_changed_count} sales logs with postcode fix and status changed." + puts "#{sales_postcode_not_fixed_status_changed_count} sales logs without postcode fix and status changed." + puts "IDs of sales logs with postcode fix and status changed: [#{sales_postcode_fixed_status_changed_ids.join(', ')}]" + puts "IDs of sales logs without postcode fix and status changed: [#{sales_postcode_not_fixed_status_changed_ids.join(', ')}]" + + sales_postcode_fixed_org_counts = SalesLog.where(id: sales_postcode_fixed_status_changed_ids).group(:owning_organisation_id).count + sales_postcode_fixed_org_counts.each do |org_id, count| + puts "Org #{org_id}: #{count} logs with postcode fix and status changed." + end + + sales_postcode_not_fixed_org_counts = SalesLog.where(id: sales_postcode_not_fixed_status_changed_ids).group(:owning_organisation_id).count + sales_postcode_not_fixed_org_counts.each do |org_id, count| + puts "Org #{org_id}: #{count} logs without postcode fix and status changed." + end + end + + desc "Find logs to fix and update postcode_full if conditions are met" + task update_postcode_full_preexisting_manual_entry_logs: :environment do + updated_count = 0 + fixed_count = 0 + not_updated_count = 0 + not_updated_ids = [] + updated_but_not_fixed_ids = [] + + logs_to_fix = LettingsLog.filter_by_year(2024).where(manual_address_entry_selected: true, uprn: nil, status: "in_progress", postcode_full: nil, updated_at: Time.zone.parse("2025-03-19 16:00:00")..Time.zone.parse("2025-03-19 17:00:00")) + + logs_to_fix.find_each do |log| + previous_version = log.versions[-2] + previous_status = previous_version&.reify&.status + + if log.address_line1 == log.address_line1_input + log.postcode_full = log.postcode_full_input + elsif log.creation_method == "bulk upload" && log.address_line1 == log.address_line1_as_entered + log.postcode_full = log.postcode_full_as_entered + end + + if log.postcode_full.present? + if log.save + Rails.logger.info "Updated postcode_full for lettings log #{log.id}" + updated_count += 1 + if log.status == previous_status + fixed_count += 1 + else + updated_but_not_fixed_ids << log.id + end + else + Rails.logger.info "Could not save changes to lettings log #{log.id}: #{log.errors.full_messages.join(', ')}" + not_updated_count += 1 + not_updated_ids << log.id + end + else + not_updated_count += 1 + not_updated_ids << log.id end end - puts "#{updated_sales_logs_count} sales logs updated." + puts "#{updated_count} logs updated." + puts "#{fixed_count} logs fixed." + puts "#{not_updated_count} logs not updated." + puts "IDs of logs not updated: [#{not_updated_ids.join(', ')}]" + puts "IDs of logs updated but not fixed: [#{updated_but_not_fixed_ids.join(', ')}]" end end diff --git a/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb b/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb index 9a9e81386..cbcf6e0e8 100644 --- a/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb +++ b/spec/lib/tasks/update_manual_address_entry_selected_prexisting_logs_spec.rb @@ -1,120 +1,210 @@ require "rails_helper" require "rake" -RSpec.describe "bulk_update:update_manual_address_entry_selected", type: :task do - let(:task) { Rake::Task["bulk_update:update_manual_address_entry_selected"] } - - let(:lettings_log_uprn_entered) do - build(:lettings_log, :completed, startdate: Time.zone.local(2024, 6, 1), needstype: 1, manual_address_entry_selected: false) +RSpec.describe "update_manual_address_entry_selected_preexisting_logs_spec", type: :task do + before do + Rake.application.rake_require("tasks/update_manual_address_entry_selected_prexisting_logs") + Rake::Task.define_task(:environment) + task.reenable end - let(:lettings_log_uprn_found) do - build(:lettings_log, :completed, startdate: Time.zone.local(2024, 9, 1), needstype: 1, manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") - end + describe "bulk_update:update_manual_address_entry_selected" do + let(:task) { Rake::Task["bulk_update:update_manual_address_entry_selected"] } - let(:lettings_log_address_fields_not_entered) do - build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 9, 1), needstype: 1) - end + let(:lettings_log_uprn_entered) do + build(:lettings_log, :completed, startdate: Time.zone.local(2024, 6, 1), needstype: 1, manual_address_entry_selected: false) + end - let(:lettings_log_address_manually_entered) do - build(:lettings_log, :completed_without_uprn, startdate: Time.zone.local(2024, 12, 1), needstype: 1) - end + let(:lettings_log_uprn_found) do + build(:lettings_log, :completed, startdate: Time.zone.local(2024, 9, 1), needstype: 1, manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") + end - let(:sales_log_uprn_entered) do - build(:sales_log, :completed, saledate: Time.zone.local(2024, 12, 1), manual_address_entry_selected: false) - end + let(:lettings_log_address_fields_not_entered) do + build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 9, 1), needstype: 1) + end - let(:sales_log_uprn_found) do - build(:sales_log, :completed, saledate: Time.zone.local(2024, 7, 1), manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") - end + let(:lettings_log_address_manually_entered) do + build(:lettings_log, :completed_without_uprn, startdate: Time.zone.local(2024, 12, 1), needstype: 1) + end - let(:sales_log_address_fields_not_entered) do - build(:sales_log, :inprogress_without_address_fields, saledate: Time.zone.local(2024, 12, 30)) - end + let(:sales_log_uprn_entered) do + build(:sales_log, :completed, saledate: Time.zone.local(2024, 12, 1), manual_address_entry_selected: false) + end - let(:sales_log_address_manually_entered) do - build(:sales_log, :completed_without_uprn, saledate: Time.zone.local(2024, 12, 30)) - end + let(:sales_log_uprn_found) do + build(:sales_log, :completed, saledate: Time.zone.local(2024, 7, 1), manual_address_entry_selected: false, address_line1_input: "1 Test Street", postcode_full_input: "SW1 1AA") + end - before do - Rake.application.rake_require("tasks/update_manual_address_entry_selected_prexisting_logs") - Rake::Task.define_task(:environment) - end + let(:sales_log_address_fields_not_entered) do + build(:sales_log, :inprogress_without_address_fields, saledate: Time.zone.local(2024, 12, 30)) + end - context "when running the task" do - context "when logs do not meet the criteria" do - before do - lettings_log_uprn_found.save!(validate: false) - lettings_log_uprn_entered.save!(validate: false) - lettings_log_address_fields_not_entered.save!(validate: false) - sales_log_uprn_found.save!(validate: false) - sales_log_uprn_entered.save!(validate: false) - sales_log_address_fields_not_entered.save!(validate: false) - end + let(:sales_log_address_manually_entered) do + build(:sales_log, :completed_without_uprn, saledate: Time.zone.local(2024, 12, 30)) + end - it "does not update logs with a UPRN entered" do - task.invoke - lettings_log_uprn_entered.reload - sales_log_uprn_entered.reload - expect(lettings_log_uprn_entered.manual_address_entry_selected).to be false - expect(lettings_log_uprn_entered.uprn).to eq("10033558653") - expect(sales_log_uprn_entered.manual_address_entry_selected).to be false - expect(sales_log_uprn_entered.uprn).to eq("10033558653") - end + context "when running the task" do + context "when logs do not meet the criteria" do + before do + lettings_log_uprn_found.save!(validate: false) + lettings_log_uprn_entered.save!(validate: false) + lettings_log_address_fields_not_entered.save!(validate: false) - it "does not update logs with a UPRN found" do - task.invoke - lettings_log_uprn_found.reload - sales_log_uprn_found.reload - expect(lettings_log_uprn_found.manual_address_entry_selected).to be false - expect(lettings_log_uprn_found.uprn).to eq("10033558653") - expect(sales_log_uprn_found.manual_address_entry_selected).to be false - expect(sales_log_uprn_found.uprn).to eq("10033558653") + sales_log_uprn_found.save!(validate: false) + sales_log_uprn_entered.save!(validate: false) + sales_log_address_fields_not_entered.save!(validate: false) + end + + it "does not update logs with a UPRN entered" do + task.invoke + + lettings_log_uprn_entered.reload + sales_log_uprn_entered.reload + + expect(lettings_log_uprn_entered.manual_address_entry_selected).to be false + expect(lettings_log_uprn_entered.uprn).to eq("10033558653") + expect(sales_log_uprn_entered.manual_address_entry_selected).to be false + expect(sales_log_uprn_entered.uprn).to eq("10033558653") + end + + it "does not update logs with a UPRN found" do + task.invoke + + lettings_log_uprn_found.reload + sales_log_uprn_found.reload + + expect(lettings_log_uprn_found.manual_address_entry_selected).to be false + expect(lettings_log_uprn_found.uprn).to eq("10033558653") + expect(sales_log_uprn_found.manual_address_entry_selected).to be false + expect(sales_log_uprn_found.uprn).to eq("10033558653") + end + + it "does not update logs with no UPRN or address fields entered" do + task.invoke + + lettings_log_address_fields_not_entered.reload + sales_log_address_fields_not_entered.reload + + expect(lettings_log_address_fields_not_entered.manual_address_entry_selected).to be false + expect(sales_log_address_fields_not_entered.manual_address_entry_selected).to be false + end end - it "does not update logs with no UPRN or address fields entered" do - task.invoke - lettings_log_address_fields_not_entered.reload - sales_log_address_fields_not_entered.reload - expect(lettings_log_address_fields_not_entered.manual_address_entry_selected).to be false - expect(sales_log_address_fields_not_entered.manual_address_entry_selected).to be false + context "when logs do meet the criteria" do + before do + lettings_log_address_manually_entered.manual_address_entry_selected = false + lettings_log_address_manually_entered.save!(validate: false) + + sales_log_address_manually_entered.manual_address_entry_selected = false + sales_log_address_manually_entered.save!(validate: false) + end + + it "updates logs with an address manually entered" do + expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be false + expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") + expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") + expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + + expect(sales_log_address_manually_entered.manual_address_entry_selected).to be false + expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(sales_log_address_manually_entered.address_line2).to eq("Testville") + expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") + expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + + task.invoke + + lettings_log_address_manually_entered.reload + sales_log_address_manually_entered.reload + + expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be true + expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") + expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") + expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + + expect(sales_log_address_manually_entered.manual_address_entry_selected).to be true + expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") + expect(sales_log_address_manually_entered.address_line2).to eq("Testville") + expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") + expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + end end end + end - context "when logs do meet the criteria" do - before do - lettings_log_address_manually_entered.manual_address_entry_selected = false - lettings_log_address_manually_entered.save!(validate: false) - sales_log_address_manually_entered.manual_address_entry_selected = false - sales_log_address_manually_entered.save!(validate: false) - end + describe "bulk_update:update_postcode_full_preexisting_manual_entry_logs" do + let(:task) { Rake::Task["bulk_update:update_postcode_full_preexisting_manual_entry_logs"] } - it "updates logs with an address manually entered" do - expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be false - expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") - expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") - expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") - expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") - expect(sales_log_address_manually_entered.manual_address_entry_selected).to be false - expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") - expect(sales_log_address_manually_entered.address_line2).to eq("Testville") - expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") - expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + let(:lettings_log_to_fix) do + build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 6, 1), updated_at: Time.zone.parse("2025-03-19 16:30:00")) + end + + let(:bu_lettings_log_to_fix) do + build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 6, 1), creation_method: "bulk upload", updated_at: Time.zone.parse("2025-03-19 16:30:00")) + end + + let(:lettings_log_not_to_fix) do + build(:lettings_log, :inprogress_without_address_fields, startdate: Time.zone.local(2024, 6, 1), updated_at: Time.zone.parse("2025-03-19 15:30:00")) + end + + before do + lettings_log_to_fix.manual_address_entry_selected = true + lettings_log_to_fix.address_line1 = "1 Test Street" + lettings_log_to_fix.address_line2 = "Testville" + lettings_log_to_fix.town_or_city = "Testford" + lettings_log_to_fix.postcode_full = nil + lettings_log_to_fix.address_line1_input = "1 Test Street" + lettings_log_to_fix.postcode_full_input = "SW1 2BB" + lettings_log_to_fix.save!(validate: false) + + bu_lettings_log_to_fix.manual_address_entry_selected = true + bu_lettings_log_to_fix.address_line1 = "1 Test Street" + bu_lettings_log_to_fix.address_line2 = "Testville" + bu_lettings_log_to_fix.town_or_city = "Testford" + bu_lettings_log_to_fix.postcode_full = nil + bu_lettings_log_to_fix.address_line1_as_entered = "1 Test Street" + bu_lettings_log_to_fix.postcode_full_as_entered = "SW1 2BB" + bu_lettings_log_to_fix.save!(validate: false) + + lettings_log_not_to_fix.postcode_full = nil + lettings_log_not_to_fix.save!(validate: false) + end + + context "when running the task" do + it "updates logs that meet the criteria" do + expect(lettings_log_to_fix.postcode_full).to be_nil + expect(lettings_log_to_fix.address_line1).to eq("1 Test Street") + expect(lettings_log_to_fix.address_line2).to eq("Testville") + expect(lettings_log_to_fix.town_or_city).to eq("Testford") + expect(lettings_log_to_fix.address_line1_input).to eq("1 Test Street") + expect(lettings_log_to_fix.postcode_full_input).to eq("SW1 2BB") + + expect(bu_lettings_log_to_fix.postcode_full).to be_nil + expect(bu_lettings_log_to_fix.address_line1_input).to be_nil + expect(bu_lettings_log_to_fix.address_line1).to eq("1 Test Street") + expect(bu_lettings_log_to_fix.address_line2).to eq("Testville") + expect(bu_lettings_log_to_fix.town_or_city).to eq("Testford") + expect(bu_lettings_log_to_fix.address_line1_as_entered).to eq("1 Test Street") + expect(bu_lettings_log_to_fix.postcode_full_as_entered).to eq("SW1 2BB") task.invoke - lettings_log_address_manually_entered.reload - sales_log_address_manually_entered.reload - - expect(lettings_log_address_manually_entered.manual_address_entry_selected).to be true - expect(lettings_log_address_manually_entered.address_line1).to eq("1 Test Street") - expect(lettings_log_address_manually_entered.address_line2).to eq("Testville") - expect(lettings_log_address_manually_entered.town_or_city).to eq("Testford") - expect(lettings_log_address_manually_entered.postcode_full).to eq("SW1 1AA") - expect(sales_log_address_manually_entered.manual_address_entry_selected).to be true - expect(sales_log_address_manually_entered.address_line1).to eq("1 Test Street") - expect(sales_log_address_manually_entered.address_line2).to eq("Testville") - expect(sales_log_address_manually_entered.town_or_city).to eq("Testford") - expect(sales_log_address_manually_entered.postcode_full).to eq("SW1 1AA") + + lettings_log_to_fix.reload + bu_lettings_log_to_fix.reload + + expect(lettings_log_to_fix.postcode_full).to eq(lettings_log_to_fix.postcode_full_input) + expect(lettings_log_to_fix.postcode_full).to eq("SW1 2BB") + expect(bu_lettings_log_to_fix.postcode_full).to eq(bu_lettings_log_to_fix.postcode_full_as_entered) + expect(bu_lettings_log_to_fix.postcode_full).to eq("SW1 2BB") + end + + it "does not update logs that do not meet the criteria" do + task.invoke + + lettings_log_not_to_fix.reload + + expect(lettings_log_not_to_fix.postcode_full).to be_nil end end end From ef523adb5fe6e9829d069b70dbbf10f6310f3b26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:59:09 +0000 Subject: [PATCH 30/31] Bump @babel/runtime from 7.19.0 to 7.26.10 (#3006) Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.19.0 to 7.26.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime) --- updated-dependencies: - dependency-name: "@babel/runtime" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> --- yarn.lock | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/yarn.lock b/yarn.lock index 05279f9ed..17e994787 100644 --- a/yarn.lock +++ b/yarn.lock @@ -913,24 +913,10 @@ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.12.5": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.16.7": - version "7.24.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.6.tgz#5b76eb89ad45e2e4a0a8db54c456251469a3358e" - integrity sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/runtime@^7.8.4": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" - integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== +"@babel/runtime@^7.12.5", "@babel/runtime@^7.16.7", "@babel/runtime@^7.8.4": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.10.tgz#a07b4d8fa27af131a633d7b3524db803eb4764c2" + integrity sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw== dependencies: regenerator-runtime "^0.14.0" @@ -3820,7 +3806,7 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.9: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== From 08916438771b8e75fc61f39b0928342d5ef7ab67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:59:26 +0000 Subject: [PATCH 31/31] Bump @babel/helpers from 7.25.0 to 7.26.10 (#3007) Bumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.25.0 to 7.26.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-helpers) --- updated-dependencies: - dependency-name: "@babel/helpers" dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> --- yarn.lock | 53 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/yarn.lock b/yarn.lock index 17e994787..5b3865609 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,15 @@ "@babel/highlight" "^7.24.7" picocolors "^1.0.0" +"@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.2.tgz#e41928bd33475305c586f6acbbb7e3ade7a6f7f5" @@ -190,11 +199,21 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz#5b3329c9a58803d5df425e5785865881a81ca48d" integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + "@babel/helper-validator-identifier@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + "@babel/helper-validator-option@^7.24.8": version "7.24.8" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz#3725cdeea8b480e86d34df15304806a06975e33d" @@ -210,12 +229,12 @@ "@babel/types" "^7.25.0" "@babel/helpers@^7.25.0": - version "7.25.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.0.tgz#e69beb7841cb93a6505531ede34f34e6a073650a" - integrity sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw== + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.10.tgz#6baea3cd62ec2d0c1068778d63cb1314f6637384" + integrity sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g== dependencies: - "@babel/template" "^7.25.0" - "@babel/types" "^7.25.0" + "@babel/template" "^7.26.9" + "@babel/types" "^7.26.10" "@babel/highlight@^7.24.7": version "7.24.7" @@ -234,6 +253,13 @@ dependencies: "@babel/types" "^7.25.2" +"@babel/parser@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.10.tgz#e9bdb82f14b97df6569b0b038edd436839c57749" + integrity sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA== + dependencies: + "@babel/types" "^7.26.10" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.3": version "7.25.3" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz#dca427b45a6c0f5c095a1c639dfe2476a3daba7f" @@ -929,6 +955,15 @@ "@babel/parser" "^7.25.0" "@babel/types" "^7.25.0" +"@babel/template@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.26.9.tgz#4577ad3ddf43d194528cff4e1fa6b232fa609bb2" + integrity sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.26.9" + "@babel/types" "^7.26.9" + "@babel/traverse@^7.24.7", "@babel/traverse@^7.24.8", "@babel/traverse@^7.25.0", "@babel/traverse@^7.25.1", "@babel/traverse@^7.25.2", "@babel/traverse@^7.25.3": version "7.25.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.3.tgz#f1b901951c83eda2f3e29450ce92743783373490" @@ -951,6 +986,14 @@ "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" +"@babel/types@^7.26.10", "@babel/types@^7.26.9": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.10.tgz#396382f6335bd4feb65741eacfc808218f859259" + integrity sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@csstools/css-parser-algorithms@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.0.tgz#dd428c4569caea7185716fbba174202a4ba41fda"

I>GIt8hvKABZXeR!?W8@SA~QxQq%BKr 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�UwoE!8rlf(i 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