From ea1a7b7f547aef1a9bfb769b419590af807f8b2b Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:06:58 +0000 Subject: [PATCH 01/16] CLDC-3176 Make deposit dynamically optional (#2210) * Update optional hint text for deposit in 24/25 * Make deposit dynamically optional, update BU * Refactor conditional page * Add validation --- .../pages/about_deposit_with_discount.rb | 17 ++++--- .../pages/about_deposit_without_discount.rb | 20 ++++++--- .../form/sales/questions/deposit_amount.rb | 12 ++++- .../discounted_ownership_scheme.rb | 2 +- .../form/sales/subsections/outright_sale.rb | 2 +- .../subsections/shared_ownership_scheme.rb | 8 ++-- app/models/sales_log.rb | 5 +++ .../sales/sale_information_validations.rb | 10 +++++ .../bulk_upload/sales/year2024/row_parser.rb | 8 ++++ config/locales/en.yml | 2 + .../pages/about_deposit_with_discount_spec.rb | 40 ++++++++++++++++- .../about_deposit_without_discount_spec.rb | 44 ++++++++++++++++++- .../sales/questions/deposit_amount_spec.rb | 10 ++++- .../shared_ownership_scheme_spec.rb | 4 ++ .../sale_information_validations_spec.rb | 44 +++++++++++++++++++ .../sales/year2024/row_parser_spec.rb | 30 +++++++++++++ 16 files changed, 237 insertions(+), 21 deletions(-) diff --git a/app/models/form/sales/pages/about_deposit_with_discount.rb b/app/models/form/sales/pages/about_deposit_with_discount.rb index 1c684b0bc..5d1e41a95 100644 --- a/app/models/form/sales/pages/about_deposit_with_discount.rb +++ b/app/models/form/sales/pages/about_deposit_with_discount.rb @@ -1,15 +1,22 @@ class Form::Sales::Pages::AboutDepositWithDiscount < ::Form::Page - def initialize(id, hsh, subsection) - super - @id = "about_deposit_with_discount" + def initialize(id, hsh, subsection, optional:) + super(id, hsh, subsection) @header = "About the deposit" - @depends_on = [{ "is_type_discount?" => true }] + @optional = optional end def questions @questions ||= [ - Form::Sales::Questions::DepositAmount.new(nil, nil, self, ownershipsch: 1), + Form::Sales::Questions::DepositAmount.new(nil, nil, self, ownershipsch: 1, optional: @optional), Form::Sales::Questions::DepositDiscount.new(nil, nil, self), ] end + + def depends_on + if form.start_year_after_2024? + [{ "is_type_discount?" => true, "stairowned_100?" => @optional }] + else + [{ "is_type_discount?" => true }] + end + end end diff --git a/app/models/form/sales/pages/about_deposit_without_discount.rb b/app/models/form/sales/pages/about_deposit_without_discount.rb index 1114b8f84..fdd74cf31 100644 --- a/app/models/form/sales/pages/about_deposit_without_discount.rb +++ b/app/models/form/sales/pages/about_deposit_without_discount.rb @@ -1,16 +1,26 @@ class Form::Sales::Pages::AboutDepositWithoutDiscount < ::Form::Page - def initialize(id, hsh, subsection, ownershipsch:) + def initialize(id, hsh, subsection, ownershipsch:, optional:) super(id, hsh, subsection) @header = "About the deposit" - @depends_on = [{ "is_type_discount?" => false, "ownershipsch" => 1 }, - { "ownershipsch" => 2 }, - { "ownershipsch" => 3, "mortgageused" => 1 }] @ownershipsch = ownershipsch + @optional = optional end def questions @questions ||= [ - Form::Sales::Questions::DepositAmount.new(nil, nil, self, ownershipsch: @ownershipsch), + Form::Sales::Questions::DepositAmount.new(nil, nil, self, ownershipsch: @ownershipsch, optional: @optional), ] end + + def depends_on + if form.start_year_after_2024? + [{ "is_type_discount?" => false, "ownershipsch" => 1, "stairowned_100?" => @optional }, + { "ownershipsch" => 2 }, + { "ownershipsch" => 3, "mortgageused" => 1 }] + else + [{ "is_type_discount?" => false, "ownershipsch" => 1 }, + { "ownershipsch" => 2 }, + { "ownershipsch" => 3, "mortgageused" => 1 }] + end + end end diff --git a/app/models/form/sales/questions/deposit_amount.rb b/app/models/form/sales/questions/deposit_amount.rb index 784bb56a1..689299e56 100644 --- a/app/models/form/sales/questions/deposit_amount.rb +++ b/app/models/form/sales/questions/deposit_amount.rb @@ -1,5 +1,5 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question - def initialize(id, hsh, subsection, ownershipsch:) + def initialize(id, hsh, subsection, ownershipsch:, optional:) super(id, hsh, subsection) @id = "deposit" @check_answer_label = "Cash deposit" @@ -10,10 +10,10 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question @step = 1 @width = 5 @prefix = "£" - @hint_text = "Enter the total cash sum paid by the buyer towards the property that was not funded by the mortgage" @derived = true @ownershipsch = ownershipsch @question_number = question_number + @optional = optional end def selected_answer_option_is_derived?(_log) @@ -30,4 +30,12 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question 116 end end + + def hint_text + if @optional + "Enter the total cash sum paid by the buyer towards the property that was not funded by the mortgage. As this is a fully staircased sale this question is optional. If you do not have the information available click save and continue" + else + "Enter the total cash sum paid by the buyer towards the property that was not funded by the mortgage" + end + end end diff --git a/app/models/form/sales/subsections/discounted_ownership_scheme.rb b/app/models/form/sales/subsections/discounted_ownership_scheme.rb index 52ee9e95c..200565ab6 100644 --- a/app/models/form/sales/subsections/discounted_ownership_scheme.rb +++ b/app/models/form/sales/subsections/discounted_ownership_scheme.rb @@ -31,7 +31,7 @@ class Form::Sales::Subsections::DiscountedOwnershipScheme < ::Form::Subsection Form::Sales::Pages::MortgageLength.new("mortgage_length_discounted_ownership", nil, self, ownershipsch: 2), Form::Sales::Pages::ExtraBorrowing.new("extra_borrowing_discounted_ownership", nil, self, ownershipsch: 2), Form::Sales::Pages::ExtraBorrowingValueCheck.new("extra_borrowing_value_check", nil, self), - Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_discounted_ownership", nil, self, ownershipsch: 2), + Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_discounted_ownership", nil, self, ownershipsch: 2, optional: false), Form::Sales::Pages::ExtraBorrowingValueCheck.new("extra_borrowing_deposit_value_check", nil, self), Form::Sales::Pages::DepositValueCheck.new("discounted_ownership_deposit_value_check", nil, self), Form::Sales::Pages::DepositAndMortgageValueCheck.new("discounted_ownership_deposit_and_mortgage_value_check_after_deposit", nil, self), diff --git a/app/models/form/sales/subsections/outright_sale.rb b/app/models/form/sales/subsections/outright_sale.rb index 245cbcb10..39275d7b2 100644 --- a/app/models/form/sales/subsections/outright_sale.rb +++ b/app/models/form/sales/subsections/outright_sale.rb @@ -18,7 +18,7 @@ class Form::Sales::Subsections::OutrightSale < ::Form::Subsection (Form::Sales::Pages::MortgageLenderOther.new("mortgage_lender_other_outright_sale", nil, self, ownershipsch: 3) unless form.start_year_after_2024?), Form::Sales::Pages::MortgageLength.new("mortgage_length_outright_sale", nil, self, ownershipsch: 3), Form::Sales::Pages::ExtraBorrowing.new("extra_borrowing_outright_sale", nil, self, ownershipsch: 3), - Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_outright_sale", nil, self, ownershipsch: 3), + Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_outright_sale", nil, self, ownershipsch: 3, optional: false), Form::Sales::Pages::DepositValueCheck.new("outright_sale_deposit_value_check", nil, self), leasehold_charge_pages, Form::Sales::Pages::MonthlyChargesValueCheck.new("monthly_charges_outright_sale_value_check", nil, self), diff --git a/app/models/form/sales/subsections/shared_ownership_scheme.rb b/app/models/form/sales/subsections/shared_ownership_scheme.rb index 66a711dcd..51abe3656 100644 --- a/app/models/form/sales/subsections/shared_ownership_scheme.rb +++ b/app/models/form/sales/subsections/shared_ownership_scheme.rb @@ -37,14 +37,16 @@ class Form::Sales::Subsections::SharedOwnershipScheme < ::Form::Subsection Form::Sales::Pages::MortgageLenderOther.new("mortgage_lender_other_shared_ownership", nil, self, ownershipsch: 1), Form::Sales::Pages::MortgageLength.new("mortgage_length_shared_ownership", nil, self, ownershipsch: 1), Form::Sales::Pages::ExtraBorrowing.new("extra_borrowing_shared_ownership", nil, self, ownershipsch: 1), - Form::Sales::Pages::AboutDepositWithDiscount.new(nil, nil, self), - Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_shared_ownership", nil, self, ownershipsch: 1), + Form::Sales::Pages::AboutDepositWithDiscount.new("about_deposit_with_discount", nil, self, optional: false), + (Form::Sales::Pages::AboutDepositWithDiscount.new("about_deposit_with_discount_optional", nil, self, optional: true) if form.start_year_after_2024?), + Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_shared_ownership", nil, self, ownershipsch: 1, optional: false), + (Form::Sales::Pages::AboutDepositWithoutDiscount.new("about_deposit_shared_ownership_optional", nil, self, ownershipsch: 1, optional: true) if form.start_year_after_2024?), Form::Sales::Pages::DepositValueCheck.new("deposit_value_check", nil, self), Form::Sales::Pages::SharedOwnershipDepositValueCheck.new("shared_ownership_deposit_value_check", nil, self), Form::Sales::Pages::MonthlyRent.new(nil, nil, self), Form::Sales::Pages::LeaseholdCharges.new("leasehold_charges_shared_ownership", nil, self, ownershipsch: 1), Form::Sales::Pages::MonthlyChargesValueCheck.new("monthly_charges_shared_ownership_value_check", nil, self), - ] + ].compact end def displayed_in_tasklist?(log) diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index 76c43b09e..13d16a786 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -121,6 +121,7 @@ class SalesLog < Log not_required << "proplen" if proplen_optional? not_required << "mortlen" if mortlen_optional? not_required << "frombeds" if frombeds_optional? + not_required << "deposit" if form.start_year_after_2024? && stairowned_100? not_required |= %w[address_line2 county postcode_full] if saledate && collection_start_year_for_date(saledate) >= 2023 @@ -495,4 +496,8 @@ class SalesLog < Log def is_not_staircasing? staircase == 2 || staircase == 3 end + + def stairowned_100? + stairowned == 100 + end end diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index 0aaa77a93..c8a4e46dc 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -110,4 +110,14 @@ module Validations::Sales::SaleInformationValidations end end end + + def validate_mortgage_used_and_stairbought(record) + return unless record.stairowned && record.mortgageused + return unless record.saledate && record.form.start_year_after_2024? + + if !record.stairowned_100? && record.mortgageused == 3 + record.errors.add :stairowned, I18n.t("validations.sale_information.stairowned.mortgageused_dont_know") + record.errors.add :mortgageused, I18n.t("validations.sale_information.stairowned.mortgageused_dont_know") + end + end end diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index 28e7ef100..c7a5349d0 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/app/services/bulk_upload/sales/year2024/row_parser.rb @@ -341,6 +341,14 @@ class BulkUpload::Sales::Year2024::RowParser }, on: :before_log + validates :field_103, + inclusion: { + in: [1, 2], + if: proc { field_88 != 100 }, + question: QUESTIONS[:field_103], + }, + on: :before_log + validates :field_9, presence: { message: I18n.t("validations.not_answered", question: "type of shared ownership sale"), diff --git a/config/locales/en.yml b/config/locales/en.yml index 204a20b4e..37239d234 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -623,6 +623,8 @@ en: over_discounted_london_max: "The percentage discount multiplied by the purchase price is %{discount_value}. This figure should not be more than £136,400 for properties in London." over_discounted_max: "The percentage discount multiplied by the purchase price is %{discount_value}. This figure should not be more than £102,400 for properties outside of London." non_staircasing_mortgage: "The mortgage and deposit added together is %{mortgage_and_deposit_total} and the purchase price times by the equity is %{expected_shared_ownership_deposit_value}. These figures should be the same." + stairowned: + mortgageused_dont_know: "The percentage owned has to be 100% if the mortgage used is 'Don’t know'" merge_request: organisation_part_of_another_merge: "This organisation is part of another merge - select a different one" organisation_not_selected: "Select an organisation from the search list" diff --git a/spec/models/form/sales/pages/about_deposit_with_discount_spec.rb b/spec/models/form/sales/pages/about_deposit_with_discount_spec.rb index cc33a9641..89db397f1 100644 --- a/spec/models/form/sales/pages/about_deposit_with_discount_spec.rb +++ b/spec/models/form/sales/pages/about_deposit_with_discount_spec.rb @@ -1,12 +1,16 @@ require "rails_helper" RSpec.describe Form::Sales::Pages::AboutDepositWithDiscount, type: :model do - subject(:page) { described_class.new(page_id, page_definition, subsection) } + subject(:page) { described_class.new(page_id, page_definition, subsection, optional: false) } - let(:page_id) { nil } + let(:page_id) { "about_deposit_with_discount" } let(:page_definition) { nil } let(:subsection) { instance_double(Form::Subsection) } + before do + allow(subsection).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: false)) + end + it "has correct subsection" do expect(page.subsection).to eq(subsection) end @@ -32,4 +36,36 @@ RSpec.describe Form::Sales::Pages::AboutDepositWithDiscount, type: :model do [{ "is_type_discount?" => true }], ) end + + context "when optional" do + subject(:page) { described_class.new(page_id, page_definition, subsection, optional: true) } + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => true }], + ) + end + end + + context "when it's a 2024 form" do + before do + allow(subsection).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: true)) + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => true, "stairowned_100?" => false }], + ) + end + + context "and optional" do + subject(:page) { described_class.new(page_id, page_definition, subsection, optional: true) } + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => true, "stairowned_100?" => true }], + ) + end + end + end end diff --git a/spec/models/form/sales/pages/about_deposit_without_discount_spec.rb b/spec/models/form/sales/pages/about_deposit_without_discount_spec.rb index 1a0b5ef4d..1a4e420c6 100644 --- a/spec/models/form/sales/pages/about_deposit_without_discount_spec.rb +++ b/spec/models/form/sales/pages/about_deposit_without_discount_spec.rb @@ -1,12 +1,16 @@ require "rails_helper" RSpec.describe Form::Sales::Pages::AboutDepositWithoutDiscount, type: :model do - subject(:page) { described_class.new(page_id, page_definition, subsection, ownershipsch: 1) } + subject(:page) { described_class.new(page_id, page_definition, subsection, ownershipsch: 1, optional: false) } let(:page_id) { nil } let(:page_definition) { nil } let(:subsection) { instance_double(Form::Subsection) } + before do + allow(subsection).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: false)) + end + it "has correct subsection" do expect(page.subsection).to eq(subsection) end @@ -34,4 +38,42 @@ RSpec.describe Form::Sales::Pages::AboutDepositWithoutDiscount, type: :model do { "ownershipsch" => 3, "mortgageused" => 1 }], ) end + + context "when optional is true" do + subject(:page) { described_class.new(page_id, page_definition, subsection, ownershipsch: 1, optional: true) } + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => false, "ownershipsch" => 1 }, + { "ownershipsch" => 2 }, + { "ownershipsch" => 3, "mortgageused" => 1 }], + ) + end + end + + context "when it's a 2024 form" do + before do + allow(subsection).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: true)) + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => false, "ownershipsch" => 1, "stairowned_100?" => false }, + { "ownershipsch" => 2 }, + { "ownershipsch" => 3, "mortgageused" => 1 }], + ) + end + + context "and optional is true" do + subject(:page) { described_class.new(page_id, page_definition, subsection, ownershipsch: 1, optional: true) } + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "is_type_discount?" => false, "ownershipsch" => 1, "stairowned_100?" => true }, + { "ownershipsch" => 2 }, + { "ownershipsch" => 3, "mortgageused" => 1 }], + ) + end + end + end end diff --git a/spec/models/form/sales/questions/deposit_amount_spec.rb b/spec/models/form/sales/questions/deposit_amount_spec.rb index e0a77b7fc..80429b5af 100644 --- a/spec/models/form/sales/questions/deposit_amount_spec.rb +++ b/spec/models/form/sales/questions/deposit_amount_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" RSpec.describe Form::Sales::Questions::DepositAmount, type: :model do - subject(:question) { described_class.new(question_id, question_definition, page, ownershipsch: 1) } + subject(:question) { described_class.new(question_id, question_definition, page, ownershipsch: 1, optional: false) } let(:question_id) { nil } let(:question_definition) { nil } @@ -50,4 +50,12 @@ RSpec.describe Form::Sales::Questions::DepositAmount, type: :model do it "has correct max" do expect(question.max).to eq(999_999) end + + context "when optional iis true" do + subject(:question) { described_class.new(question_id, question_definition, page, ownershipsch: 1, optional: true) } + + it "has a correct hint_text" do + expect(question.hint_text).to eq("Enter the total cash sum paid by the buyer towards the property that was not funded by the mortgage. As this is a fully staircased sale this question is optional. If you do not have the information available click save and continue") + end + end end diff --git a/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb b/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb index 192f7cbda..3746768d0 100644 --- a/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb +++ b/spec/models/form/sales/subsections/shared_ownership_scheme_spec.rb @@ -7,6 +7,10 @@ RSpec.describe Form::Sales::Subsections::SharedOwnershipScheme, type: :model do let(:subsection_definition) { nil } let(:section) { instance_double(Form::Sales::Sections::SaleInformation) } + before do + allow(section).to receive(:form).and_return(instance_double(Form, start_year_after_2024?: false)) + end + it "has correct section" do expect(shared_ownership_scheme.section).to eq(section) end diff --git a/spec/models/validations/sales/sale_information_validations_spec.rb b/spec/models/validations/sales/sale_information_validations_spec.rb index 73243e9fa..3d323112e 100644 --- a/spec/models/validations/sales/sale_information_validations_spec.rb +++ b/spec/models/validations/sales/sale_information_validations_spec.rb @@ -756,4 +756,48 @@ RSpec.describe Validations::Sales::SaleInformationValidations do end end end + + describe "#validate_mortgage_used_and_stairbought" do + let(:now) { Time.zone.local(2024, 4, 4) } + + before do + Timecop.freeze(now) + Singleton.__init__(FormHandler) + end + + after do + Timecop.return + Singleton.__init__(FormHandler) + end + + context "when mortgageused don't know" do + let(:record) { build(:sales_log, ownershipsch: 1, type: 9, saledate: now, mortgageused: 3) } + + it "does not add an error if stairowned 100" do + record.stairowned = 100 + sale_information_validator.validate_mortgage_used_and_stairbought(record) + + expect(record.errors).to be_empty + end + + it "adds an error if stairowned is not 100" do + record.stairowned = 90 + sale_information_validator.validate_mortgage_used_and_stairbought(record) + + expect(record.errors[:stairowned]).to include("The percentage owned has to be 100% if the mortgage used is 'Don’t know'") + expect(record.errors[:mortgageused]).to include("The percentage owned has to be 100% if the mortgage used is 'Don’t know'") + end + end + + context "when the collection year is before 2024" do + let(:record) { build(:sales_log, ownershipsch: 1, type: 9, saledate: now, mortgageused: 3, stairowned: 90) } + let(:now) { Time.zone.local(2023, 4, 4) } + + it "does not add an error" do + sale_information_validator.validate_mortgage_used_and_stairbought(record) + + expect(record.errors).to be_empty + end + end + end end diff --git a/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb b/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb index 93e6fdca1..d93453a22 100644 --- a/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb +++ b/spec/services/bulk_upload/sales/year2024/row_parser_spec.rb @@ -975,6 +975,36 @@ RSpec.describe BulkUpload::Sales::Year2024::RowParser do end end + describe "#field_103" do # shared ownership mortgageused + context "when invalid value" do + let(:attributes) { setup_section_params.merge(field_103: "4") } + + it "returns correct errors" do + expect(parser.errors[:field_103]).to include("Enter a valid value for Was a mortgage used for the purchase of this property? - Shared ownership") + end + end + + context "when value is 3 and stairowned is not 100" do + let(:attributes) { setup_section_params.merge(field_103: "3", field_86: "1", field_87: "50", field_88: "99", field_109: nil) } + + it "returns correct errors" do + expect(parser.errors[:field_103]).to include("Enter a valid value for Was a mortgage used for the purchase of this property? - Shared ownership") + end + end + + context "when value is 3 and stairowned is 100" do + let(:attributes) { setup_section_params.merge(field_103: "3", field_86: "1", field_87: "50", field_88: "100", field_109: nil) } + + it "does not add errors and sets mortgage used to 3" do + expect(parser.log.mortgageused).to be(3) + expect(parser.log.stairowned).to be(100) + expect(parser.log.deposit).to be(nil) + expect(parser.errors[:field_103]).to be_empty + expect(parser.errors[:field_109]).to be_empty + end + end + end + describe "soft validations" do context "when soft validation is triggered" do let(:attributes) { valid_attributes.merge({ field_31: 22, field_35: 5 }) } From cc8ba09b92a43c245dd2e686b254c24563078eab Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:13:19 +0000 Subject: [PATCH 02/16] Update nationality hint text (#2225) --- .../form/lettings/questions/nationality_all_group.rb | 2 +- app/models/form/sales/questions/nationality_all_group.rb | 9 +++++++++ .../lettings/questions/nationality_all_group_spec.rb | 2 +- .../form/sales/questions/nationality_all_group_spec.rb | 4 ++-- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/models/form/lettings/questions/nationality_all_group.rb b/app/models/form/lettings/questions/nationality_all_group.rb index 2ba9e5cde..49b000a16 100644 --- a/app/models/form/lettings/questions/nationality_all_group.rb +++ b/app/models/form/lettings/questions/nationality_all_group.rb @@ -6,7 +6,7 @@ class Form::Lettings::Questions::NationalityAllGroup < ::Form::Question @header = "What is the nationality of the lead tenant?" @type = "radio" @check_answers_card_number = 1 - @hint_text = "The lead tenant is the person in the household who does the most paid work. If several people do the same paid work, the lead tenant is whoever is the oldest." + @hint_text = "The lead tenant is the person in the household who does the most paid work. If several people do the same paid work, the lead tenant is whoever is the oldest. If the lead tenant is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the tenant should decide which country to enter." @answer_options = ANSWER_OPTIONS @question_number = 36 @conditional_for = { "nationality_all" => [12] } diff --git a/app/models/form/sales/questions/nationality_all_group.rb b/app/models/form/sales/questions/nationality_all_group.rb index c9b1e71bc..faf29487e 100644 --- a/app/models/form/sales/questions/nationality_all_group.rb +++ b/app/models/form/sales/questions/nationality_all_group.rb @@ -10,6 +10,7 @@ class Form::Sales::Questions::NationalityAllGroup < ::Form::Question @question_number = buyer_index == 1 ? 24 : 32 @conditional_for = buyer_index == 1 ? { "nationality_all" => [12] } : { "nationality_all_buyer2" => [12] } @hidden_in_check_answers = { "depends_on" => [{ id => 12 }] } + @buyer_index = buyer_index end ANSWER_OPTIONS = { @@ -17,4 +18,12 @@ class Form::Sales::Questions::NationalityAllGroup < ::Form::Question "12" => { "value" => "Other" }, "0" => { "value" => "Buyer prefers not to say" }, }.freeze + + def hint_text + if @buyer_index == 1 + "Buyer 1 is the person in the household who does the most paid work. If it’s a joint purchase and the buyers do the same amount of paid work, buyer 1 is whoever is the oldest. If buyer 1 is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the buyer should decide which country to enter." + else + "If buyer 2 is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the buyer should decide which country to enter." + end + end end diff --git a/spec/models/form/lettings/questions/nationality_all_group_spec.rb b/spec/models/form/lettings/questions/nationality_all_group_spec.rb index ff8a47b59..d92551546 100644 --- a/spec/models/form/lettings/questions/nationality_all_group_spec.rb +++ b/spec/models/form/lettings/questions/nationality_all_group_spec.rb @@ -26,7 +26,7 @@ RSpec.describe Form::Lettings::Questions::NationalityAllGroup, type: :model do end it "has the correct hint_text" do - expect(question.hint_text).to eq("The lead tenant is the person in the household who does the most paid work. If several people do the same paid work, the lead tenant is whoever is the oldest.") + expect(question.hint_text).to eq("The lead tenant is the person in the household who does the most paid work. If several people do the same paid work, the lead tenant is whoever is the oldest. If the lead tenant is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the tenant should decide which country to enter.") end it "has the correct answer_options" do diff --git a/spec/models/form/sales/questions/nationality_all_group_spec.rb b/spec/models/form/sales/questions/nationality_all_group_spec.rb index b0bfbbfc8..cd70b2a12 100644 --- a/spec/models/form/sales/questions/nationality_all_group_spec.rb +++ b/spec/models/form/sales/questions/nationality_all_group_spec.rb @@ -47,7 +47,7 @@ RSpec.describe Form::Sales::Questions::NationalityAllGroup, type: :model do end it "has the correct hint" do - expect(question.hint_text).to eq "Buyer 1 is the person in the household who does the most paid work. If it’s a joint purchase and the buyers do the same amount of paid work, buyer 1 is whoever is the oldest." + expect(question.hint_text).to eq "Buyer 1 is the person in the household who does the most paid work. If it’s a joint purchase and the buyers do the same amount of paid work, buyer 1 is whoever is the oldest. If buyer 1 is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the buyer should decide which country to enter." end it "has the correct header" do @@ -75,7 +75,7 @@ RSpec.describe Form::Sales::Questions::NationalityAllGroup, type: :model do end it "has the correct hint" do - expect(question.hint_text).to eq("") + expect(question.hint_text).to eq "If buyer 2 is a dual national of the United Kingdom and another country, enter United Kingdom. If they are a dual national of two other countries, the buyer should decide which country to enter." end it "has the correct header" do From b4c96508e1bd813aa79e2be239291a2c65ee21c0 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 12 Feb 2024 16:58:36 +0000 Subject: [PATCH 03/16] Update postgres in dockerfile (#2234) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index da6d4ba6f..a65696f84 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,7 @@ RUN apk add --update --no-cache tzdata && \ # build-base: compilation tools for bundle # yarn: node package manager # postgresql-dev: postgres driver and libraries -RUN apk add --no-cache build-base=0.5-r3 nodejs-current=20.8.1-r0 yarn=1.22.19-r0 postgresql13-dev=13.13-r0 git=2.40.1-r0 bash=5.2.15-r5 +RUN apk add --no-cache build-base=0.5-r3 nodejs-current=20.8.1-r0 yarn=1.22.19-r0 postgresql13-dev=13.14-r0 git=2.40.1-r0 bash=5.2.15-r5 # Bundler version should be the same version as what the Gemfile.lock was bundled with RUN gem install bundler:2.3.14 --no-document From 90cfedb0e12eb10719c03a142f023c501ce4a6f0 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:21:06 +0000 Subject: [PATCH 04/16] Deletion report sales bug fix (#2235) * feat: don't display error row components for rows with no errors * feat: add failing test for bug * feat: remove redundant condition --- .../deletion_report.html.erb | 4 +++- .../deletion_report.html.erb | 4 +++- ...lk_upload_lettings_resume_controller_spec.rb | 17 +++++++++++++++++ .../bulk_upload_sales_resume_controller_spec.rb | 17 +++++++++++++++++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/app/views/bulk_upload_lettings_resume/deletion_report.html.erb b/app/views/bulk_upload_lettings_resume/deletion_report.html.erb index 2624012d4..881f9026c 100644 --- a/app/views/bulk_upload_lettings_resume/deletion_report.html.erb +++ b/app/views/bulk_upload_lettings_resume/deletion_report.html.erb @@ -18,7 +18,9 @@
<% @bulk_upload.bulk_upload_errors.order_by_row.order_by_cell.group_by(&:row).each do |_row, errors_for_row| %> - <%= render BulkUploadErrorRowComponent.new(bulk_upload_errors: all_answers_to_be_cleared(errors_for_row)) %> + <% if all_answers_to_be_cleared(errors_for_row).present? %> + <%= render BulkUploadErrorRowComponent.new(bulk_upload_errors: all_answers_to_be_cleared(errors_for_row)) %> + <% end %> <% end %>
diff --git a/app/views/bulk_upload_sales_resume/deletion_report.html.erb b/app/views/bulk_upload_sales_resume/deletion_report.html.erb index 3b6088c3c..299cff4f4 100644 --- a/app/views/bulk_upload_sales_resume/deletion_report.html.erb +++ b/app/views/bulk_upload_sales_resume/deletion_report.html.erb @@ -18,7 +18,9 @@
<% @bulk_upload.bulk_upload_errors.order_by_row.order_by_cell.group_by(&:row).each do |_row, errors_for_row| %> - <%= render BulkUploadErrorRowComponent.new(bulk_upload_errors: all_answers_to_be_cleared(errors_for_row)) %> + <% if all_answers_to_be_cleared(errors_for_row).present? %> + <%= render BulkUploadErrorRowComponent.new(bulk_upload_errors: all_answers_to_be_cleared(errors_for_row)) %> + <% end %> <% end %>
diff --git a/spec/requests/bulk_upload_lettings_resume_controller_spec.rb b/spec/requests/bulk_upload_lettings_resume_controller_spec.rb index ce2c3b7c6..c91211d5a 100644 --- a/spec/requests/bulk_upload_lettings_resume_controller_spec.rb +++ b/spec/requests/bulk_upload_lettings_resume_controller_spec.rb @@ -211,5 +211,22 @@ RSpec.describe BulkUploadLettingsResumeController, type: :request do expect(response).to redirect_to("/lettings-logs/bulk-upload-soft-validations-check/#{bulk_upload.id}/chosen") end end + + context "and has a row with all non-cleared errors" do + let(:bulk_upload_errors) { [create(:bulk_upload_error, row: 1), create(:bulk_upload_error, row: 2, category: :not_answered), create(:bulk_upload_error, row: 3, category: :soft_validation), create(:bulk_upload_error, row: 4)] } + let(:bulk_upload) { create(:bulk_upload, :lettings, user:, bulk_upload_errors:) } + + it "renders the page correctly" do + get "/lettings-logs/bulk-upload-resume/#{bulk_upload.id}/deletion-report" + + expect(response).to be_successful + + expect(response.body).to include("Bulk upload for lettings") + expect(response.body).to include("2023/24") + expect(response.body).to include("These 2 answers will be deleted if you upload the log") + expect(response.body).to include(bulk_upload.filename) + expect(response.body).to include("Clear this data and upload the logs") + end + end end end diff --git a/spec/requests/bulk_upload_sales_resume_controller_spec.rb b/spec/requests/bulk_upload_sales_resume_controller_spec.rb index 36c853097..47acc1ae6 100644 --- a/spec/requests/bulk_upload_sales_resume_controller_spec.rb +++ b/spec/requests/bulk_upload_sales_resume_controller_spec.rb @@ -211,5 +211,22 @@ RSpec.describe BulkUploadSalesResumeController, type: :request do expect(response).to redirect_to("/sales-logs/bulk-upload-soft-validations-check/#{bulk_upload.id}/chosen") end end + + context "and has a row with all non-cleared errors" do + let(:bulk_upload_errors) { [create(:bulk_upload_error, row: 1), create(:bulk_upload_error, row: 2, category: :not_answered), create(:bulk_upload_error, row: 3, category: :soft_validation), create(:bulk_upload_error, row: 4)] } + let(:bulk_upload) { create(:bulk_upload, :sales, user:, bulk_upload_errors:) } + + it "renders the page correctly" do + get "/sales-logs/bulk-upload-resume/#{bulk_upload.id}/deletion-report" + + expect(response).to be_successful + + expect(response.body).to include("Bulk upload for sales") + expect(response.body).to include("2023/24") + expect(response.body).to include("These 2 answers will be deleted if you upload the log") + expect(response.body).to include(bulk_upload.filename) + expect(response.body).to include("Clear this data and upload the logs") + end + end end end From ac16c743030943c4d9881fe0a7176c2615be8293 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 13 Feb 2024 09:57:00 +0000 Subject: [PATCH 05/16] CLDC-3179 Update routing for previous postcode (#2207) * Update routing for previous postcode * Infer ppostcode_full for discounted sales * Escape characters * Update previous la routing * Set prevloc * Move postcode inferance * Remove validation for 2024 * Update postgres in dockerfile --- .../derived_variables/sales_log_variables.rb | 9 +++ .../form/sales/pages/last_accommodation.rb | 6 ++ .../form/sales/pages/last_accommodation_la.rb | 6 ++ .../sales/household_validations.rb | 9 --- .../validations/sales/property_validations.rb | 1 + .../sales/pages/last_accommodation_la_spec.rb | 35 ++++++++++- .../sales/pages/last_accommodation_spec.rb | 33 +++++++++++ spec/models/sales_log_spec.rb | 54 ++++++++++++++++- .../sales/household_validations_spec.rb | 58 ------------------- .../sales/property_validations_spec.rb | 12 +++- 10 files changed, 152 insertions(+), 71 deletions(-) diff --git a/app/models/derived_variables/sales_log_variables.rb b/app/models/derived_variables/sales_log_variables.rb index f662ab3df..ec8d21b30 100644 --- a/app/models/derived_variables/sales_log_variables.rb +++ b/app/models/derived_variables/sales_log_variables.rb @@ -17,6 +17,15 @@ module DerivedVariables::SalesLogVariables self.hoyear = hodate.year end self.deposit = value if outright_sale? && mortgage_not_used? + + if saledate && form.start_year_after_2024? && discounted_ownership_sale? + self.ppostcode_full = postcode_full + self.ppcodenk = 0 if postcode_full.present? + self.prevloc = la + self.is_previous_la_inferred = is_la_inferred + self.previous_la_known = la_known + end + self.pcode1, self.pcode2 = postcode_full.split if postcode_full.present? self.ppostc1, self.ppostc2 = ppostcode_full.split if ppostcode_full.present? self.totchild = total_child diff --git a/app/models/form/sales/pages/last_accommodation.rb b/app/models/form/sales/pages/last_accommodation.rb index 373a20511..2d3448399 100644 --- a/app/models/form/sales/pages/last_accommodation.rb +++ b/app/models/form/sales/pages/last_accommodation.rb @@ -10,4 +10,10 @@ class Form::Sales::Pages::LastAccommodation < ::Form::Page Form::Sales::Questions::PreviousPostcode.new(nil, nil, self), ] end + + def routed_to?(log, _user) + return false if log.form.start_year_after_2024? && log.discounted_ownership_sale? + + super + end end diff --git a/app/models/form/sales/pages/last_accommodation_la.rb b/app/models/form/sales/pages/last_accommodation_la.rb index 6e4211e12..615a30196 100644 --- a/app/models/form/sales/pages/last_accommodation_la.rb +++ b/app/models/form/sales/pages/last_accommodation_la.rb @@ -13,4 +13,10 @@ class Form::Sales::Pages::LastAccommodationLa < ::Form::Page Form::Sales::Questions::Prevloc.new(nil, nil, self), ] end + + def routed_to?(log, _user) + return false if log.form.start_year_after_2024? && log.discounted_ownership_sale? + + super + end end diff --git a/app/models/validations/sales/household_validations.rb b/app/models/validations/sales/household_validations.rb index 6e10b89b5..c23a72609 100644 --- a/app/models/validations/sales/household_validations.rb +++ b/app/models/validations/sales/household_validations.rb @@ -11,15 +11,6 @@ module Validations::Sales::HouseholdValidations shared_validate_partner_count(record, 6) end - def validate_previous_postcode(record) - return unless record.postcode_full && record.ppostcode_full && record.discounted_ownership_sale? - - unless record.postcode_full == record.ppostcode_full - record.errors.add :postcode_full, :postcodes_not_matching, message: I18n.t("validations.household.postcode.discounted_ownership") - record.errors.add :ppostcode_full, :postcodes_not_matching, message: I18n.t("validations.household.postcode.discounted_ownership") - end - end - def validate_buyers_living_in_property(record) return unless record.form.start_date.year >= 2023 diff --git a/app/models/validations/sales/property_validations.rb b/app/models/validations/sales/property_validations.rb index 3a8f6a463..fc8e4759b 100644 --- a/app/models/validations/sales/property_validations.rb +++ b/app/models/validations/sales/property_validations.rb @@ -1,5 +1,6 @@ module Validations::Sales::PropertyValidations def validate_postcodes_match_if_discounted_ownership(record) + return unless record.saledate && !record.form.start_year_after_2024? return unless record.ppostcode_full.present? && record.postcode_full.present? if record.discounted_ownership_sale? && record.ppostcode_full != record.postcode_full diff --git a/spec/models/form/sales/pages/last_accommodation_la_spec.rb b/spec/models/form/sales/pages/last_accommodation_la_spec.rb index 20daf0525..54df5a365 100644 --- a/spec/models/form/sales/pages/last_accommodation_la_spec.rb +++ b/spec/models/form/sales/pages/last_accommodation_la_spec.rb @@ -5,8 +5,22 @@ RSpec.describe Form::Sales::Pages::LastAccommodationLa, type: :model do let(:page_id) { nil } let(:page_definition) { nil } - let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, start_date:)) } + let(:subsection) { instance_double(Form::Subsection, form: instance_double(Form, depends_on_met: true)) } let(:start_date) { Time.utc(2022, 4, 1) } + let(:log) { create(:sales_log, :completed, saledate: now) } + let(:now) { Time.zone.local(2023, 4, 4) } + + before do + Timecop.freeze(now) + Singleton.__init__(FormHandler) + allow(subsection).to receive(:depends_on).and_return(nil) + allow(subsection).to receive(:enabled?).and_return(true) + end + + after do + Timecop.return + Singleton.__init__(FormHandler) + end it "has correct subsection" do expect(page.subsection).to eq(subsection) @@ -33,4 +47,23 @@ RSpec.describe Form::Sales::Pages::LastAccommodationLa, type: :model do "is_previous_la_inferred" => false, }]) end + + it "is routed to" do + log.ownershipsch = 2 + expect(page).to be_routed_to(log, nil) + end + + context "with 2024 form" do + let(:now) { Time.zone.local(2024, 4, 4) } + + it "is routed to for 2024 non discounted sale logs" do + log.update!(ownershipsch: 1) + expect(page).to be_routed_to(log, nil) + end + + it "is not routed to for 2024 discounted sale logs" do + log.update!(ownershipsch: 2) + expect(page).not_to be_routed_to(log, nil) + end + end end diff --git a/spec/models/form/sales/pages/last_accommodation_spec.rb b/spec/models/form/sales/pages/last_accommodation_spec.rb index 753aa7dc8..a972d96c5 100644 --- a/spec/models/form/sales/pages/last_accommodation_spec.rb +++ b/spec/models/form/sales/pages/last_accommodation_spec.rb @@ -3,10 +3,24 @@ require "rails_helper" RSpec.describe Form::Sales::Pages::LastAccommodation, type: :model do subject(:page) { described_class.new(page_id, page_definition, subsection) } + let(:log) { create(:sales_log, :completed, saledate: now) } + let(:now) { Time.zone.local(2023, 4, 4) } + let(:page_id) { nil } let(:page_definition) { nil } let(:subsection) { instance_double(Form::Subsection) } + before do + Timecop.freeze(now) + Singleton.__init__(FormHandler) + allow(subsection).to receive(:depends_on).and_return(nil) + end + + after do + Timecop.return + Singleton.__init__(FormHandler) + end + it "has correct subsection" do expect(page.subsection).to eq(subsection) end @@ -30,4 +44,23 @@ RSpec.describe Form::Sales::Pages::LastAccommodation, type: :model do it "has correct depends_on" do expect(page.depends_on).to be_nil end + + it "is routed to" do + log.ownershipsch = 2 + expect(page).to be_routed_to(log, nil) + end + + context "with 2024 form" do + let(:now) { Time.zone.local(2024, 4, 4) } + + it "is routed to for 2024 non discounted sale logs" do + log.update!(ownershipsch: 1) + expect(page).to be_routed_to(log, nil) + end + + it "is not routed to for 2024 discounted sale logs" do + log.update!(ownershipsch: 2) + expect(page).not_to be_routed_to(log, nil) + end + end end diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index 42aa64fec..00792b0bd 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -657,7 +657,7 @@ RSpec.describe SalesLog, type: :model do end before do - WebMock.stub_request(:get, /api.postcodes.io\/postcodes\/CA101AA/) + WebMock.stub_request(:get, /api\.postcodes\.io\/postcodes\/CA101AA/) .to_return(status: 200, body: '{"status":200,"result":{"admin_district":"Cumberland","codes":{"admin_district":"E06000064"}}}', headers: {}) Timecop.freeze(2023, 5, 1) @@ -687,7 +687,7 @@ RSpec.describe SalesLog, type: :model do end before do - WebMock.stub_request(:get, /api.postcodes.io\/postcodes\/CA101AA/) + WebMock.stub_request(:get, /api\.postcodes\.io\/postcodes\/CA101AA/) .to_return(status: 200, body: '{"status":200,"result":{"admin_district":"Eden","codes":{"admin_district":"E07000030"}}}', headers: {}) Timecop.freeze(2023, 5, 2) @@ -703,6 +703,56 @@ RSpec.describe SalesLog, type: :model do expect(address_sales_log_23_24.la).to eq("E06000064") expect(record_from_db["la"]).to eq("E06000064") end + + it "does not set previous postcode or previous la for discounted sale" do + address_sales_log_23_24.update!(ownershipsch: 2, ppostcode_full: nil, prevloc: nil) + record_from_db = described_class.find(address_sales_log_23_24.id) + expect(address_sales_log_23_24.ppostcode_full).to eq(nil) + expect(record_from_db["ppostcode_full"]).to eq(nil) + expect(record_from_db["prevloc"]).to eq(nil) + end + end + + context "with 24/25 logs" do + let(:address_sales_log_24_25) do + described_class.create({ + owning_organisation:, + created_by: created_by_user, + ppcodenk: 1, + postcode_full: "CA10 1AA", + ppostcode_full: nil, + prevloc: nil, + saledate: Time.zone.local(2024, 5, 2), + }) + end + + before do + WebMock.stub_request(:get, /api\.postcodes\.io\/postcodes\/CA101AA/) + .to_return(status: 200, body: '{"status":200,"result":{"admin_district":"Eden","codes":{"admin_district":"E07000030"}}}', headers: {}) + + Timecop.freeze(2024, 5, 2) + Singleton.__init__(FormHandler) + end + + after do + Timecop.unfreeze + end + + it "sets previous postcode for discounted sale" do + address_sales_log_24_25.update!(ownershipsch: 2, ppostcode_full: nil) + record_from_db = described_class.find(address_sales_log_24_25.id) + expect(address_sales_log_24_25.ppostcode_full).to eq("CA10 1AA") + expect(record_from_db["ppostcode_full"]).to eq("CA10 1AA") + expect(record_from_db["prevloc"]).to eq("E06000064") + end + + it "does not set previous postcode for non discounted sale" do + address_sales_log_24_25.update!(ownershipsch: 1, ppostcode_full: nil) + record_from_db = described_class.find(address_sales_log_24_25.id) + expect(address_sales_log_24_25.ppostcode_full).to eq(nil) + expect(record_from_db["ppostcode_full"]).to eq(nil) + expect(record_from_db["prevloc"]).to eq(nil) + end end it "errors if the property postcode is emptied" do diff --git a/spec/models/validations/sales/household_validations_spec.rb b/spec/models/validations/sales/household_validations_spec.rb index 898a47fcc..deddfa8ef 100644 --- a/spec/models/validations/sales/household_validations_spec.rb +++ b/spec/models/validations/sales/household_validations_spec.rb @@ -154,64 +154,6 @@ RSpec.describe Validations::Sales::HouseholdValidations do end end - describe "previous postcode validations" do - let(:record) { build(:sales_log) } - - context "with a discounted sale" do - before do - record.ownershipsch = 2 - end - - it "adds an error when previous and current postcodes are not the same" do - record.postcode_full = "SO32 3PT" - record.ppostcode_full = "DN6 7FB" - household_validator.validate_previous_postcode(record) - expect(record.errors["postcode_full"]) - .to include(match I18n.t("validations.household.postcode.discounted_ownership")) - expect(record.errors["ppostcode_full"]) - .to include(match I18n.t("validations.household.postcode.discounted_ownership")) - end - - it "allows same postcodes" do - record.postcode_full = "SO32 3PT" - record.ppostcode_full = "SO32 3PT" - household_validator.validate_previous_postcode(record) - expect(record.errors["postcode_full"]).to be_empty - expect(record.errors["ppostcode_full"]).to be_empty - end - - it "does not add an error when postcode is missing" do - record.postcode_full = nil - record.ppostcode_full = "SO32 3PT" - household_validator.validate_previous_postcode(record) - expect(record.errors["postcode_full"]).to be_empty - expect(record.errors["ppostcode_full"]).to be_empty - end - - it "does not add an error when previous postcode is missing" do - record.postcode_full = "SO32 3PT" - record.ppostcode_full = nil - household_validator.validate_previous_postcode(record) - expect(record.errors["postcode_full"]).to be_empty - expect(record.errors["ppostcode_full"]).to be_empty - end - end - - context "without a discounted sale" do - before do - record.ownershipsch = 1 - end - - it "allows different postcodes" do - record.postcode_full = "SO32 3PT" - record.ppostcode_full = "DN6 7FB" - household_validator.validate_previous_postcode(record) - expect(record.errors["postcode_full"]).to be_empty - expect(record.errors["ppostcode_full"]).to be_empty - end - end - end - describe "validating fields about buyers living in the property" do let(:sales_log) { FactoryBot.create(:sales_log, :outright_sale_setup_complete, noint: 1, companybuy: 2, buylivein:, jointpur:, jointmore:, buy1livein:) } diff --git a/spec/models/validations/sales/property_validations_spec.rb b/spec/models/validations/sales/property_validations_spec.rb index 0152428d8..f84f65966 100644 --- a/spec/models/validations/sales/property_validations_spec.rb +++ b/spec/models/validations/sales/property_validations_spec.rb @@ -19,7 +19,7 @@ RSpec.describe Validations::Sales::PropertyValidations do end context "when ownership scheme is discounted ownership" do - let(:record) { build(:sales_log, ownershipsch: 2) } + let(:record) { build(:sales_log, ownershipsch: 2, saledate: Time.zone.local(2023, 4, 5)) } it "when ppostcode_full is not present no error is added" do record.postcode_full = "SW1A 1AA" @@ -54,6 +54,16 @@ RSpec.describe Validations::Sales::PropertyValidations do expect(record.errors["ppostcode_full"]).to include(match I18n.t("validations.property.postcode.must_match_previous")) expect(record.errors["ownershipsch"]).to include(match I18n.t("validations.property.postcode.must_match_previous")) end + + it "does not add error for 2024 log" do + record.postcode_full = "SW1A 1AA" + record.ppostcode_full = "SW1A 0AA" + record.saledate = Time.zone.local(2024, 4, 5) + property_validator.validate_postcodes_match_if_discounted_ownership(record) + expect(record.errors["postcode_full"]).to be_empty + expect(record.errors["ppostcode_full"]).to be_empty + expect(record.errors["ownershipsch"]).to be_empty + end end end From 62e4352176730334dd71339397ae08a80517a831 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 13 Feb 2024 16:15:49 +0000 Subject: [PATCH 06/16] Set export base number depending on the year (#2224) --- .../exports/lettings_log_export_service.rb | 2 +- .../lettings_log_export_service_spec.rb | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/app/services/exports/lettings_log_export_service.rb b/app/services/exports/lettings_log_export_service.rb index 404b9f0e6..e63219f7d 100644 --- a/app/services/exports/lettings_log_export_service.rb +++ b/app/services/exports/lettings_log_export_service.rb @@ -12,9 +12,9 @@ module Exports start_time = Time.zone.now daily_run_number = get_daily_run_number archives_for_manifest = {} - base_number = LogsExport.where(empty_export: false).maximum(:base_number) || 1 recent_export = LogsExport.order("started_at").last collection_years_to_export(collection_year).each do |collection| + base_number = LogsExport.where(empty_export: false, collection:).maximum(:base_number) || 1 export = build_export_run(collection, start_time, base_number, full_update) archives = write_export_archive(export, collection, start_time, recent_export, full_update) diff --git a/spec/services/exports/lettings_log_export_service_spec.rb b/spec/services/exports/lettings_log_export_service_spec.rb index 4e76364c4..65a41df26 100644 --- a/spec/services/exports/lettings_log_export_service_spec.rb +++ b/spec/services/exports/lettings_log_export_service_spec.rb @@ -256,6 +256,32 @@ RSpec.describe Exports::LettingsLogExportService do export_service.export_xml_lettings_logs(collection_year: 2022) end + + context "and previous full exports are different for previous years" do + let(:expected_zip_filename) { "core_2021_2022_apr_mar_f0007_inc0004.zip" } + let(:expected_zip_filename2) { "core_2022_2023_apr_mar_f0001_inc0001.zip" } + + before do + LogsExport.new(started_at: Time.zone.yesterday, base_number: 7, increment_number: 3, collection: 2021).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(expected_zip_filename2, any_args) + expect(Rails.logger).to receive(:info).with("Building export run for 2021") + expect(Rails.logger).to receive(:info).with("Creating core_2021_2022_apr_mar_f0007_inc0004 - 1 logs") + expect(Rails.logger).to receive(:info).with("Added core_2021_2022_apr_mar_f0007_inc0004_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_2021_2022_apr_mar_f0007_inc0004.zip") + expect(Rails.logger).to receive(:info).with("Building export run for 2022") + expect(Rails.logger).to receive(:info).with("Creating core_2022_2023_apr_mar_f0001_inc0001 - 1 logs") + expect(Rails.logger).to receive(:info).with("Added core_2022_2023_apr_mar_f0001_inc0001_pt001.xml") + expect(Rails.logger).to receive(:info).with("Writing core_2022_2023_apr_mar_f0001_inc0001.zip") + expect(Rails.logger).to receive(:info).with("Building export run for 2023") + expect(Rails.logger).to receive(:info).with("Creating core_2023_2024_apr_mar_f0001_inc0001 - 0 logs") + + export_service.export_xml_lettings_logs + end + end end end From 4508e776f20c420aadeb8537b0db2552d3adb709 Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Wed, 7 Feb 2024 13:05:36 +0000 Subject: [PATCH 07/16] CLDC-3126: Move privacy notice question --- .../subsections/household_characteristics.rb | 2 +- app/models/form/lettings/subsections/setup.rb | 1 + .../subsections/household_characteristics.rb | 2 +- app/models/form/sales/subsections/setup.rb | 1 + app/models/form_handler.rb | 16 +- .../bulk_upload/sales/year2024/row_parser.rb | 7 - .../files/lettings_log_csv_export_codes.csv | 4 +- .../files/lettings_log_csv_export_labels.csv | 4 +- ...tings_log_csv_export_non_support_codes.csv | 4 +- ...ings_log_csv_export_non_support_labels.csv | 4 +- .../files/sales_logs_csv_export_codes.csv | 4 +- .../files/sales_logs_csv_export_labels.csv | 4 +- .../household_characteristics_spec.rb | 417 ++++++++++++------ .../form/lettings/subsections/setup_spec.rb | 62 ++- .../form/sales/pages/privacy_notice_spec.rb | 6 + .../household_characteristics_spec.rb | 1 - .../form/sales/subsections/setup_spec.rb | 1 + 17 files changed, 356 insertions(+), 184 deletions(-) diff --git a/app/models/form/lettings/subsections/household_characteristics.rb b/app/models/form/lettings/subsections/household_characteristics.rb index bb8533c12..1e442cb18 100644 --- a/app/models/form/lettings/subsections/household_characteristics.rb +++ b/app/models/form/lettings/subsections/household_characteristics.rb @@ -8,7 +8,7 @@ class Form::Lettings::Subsections::HouseholdCharacteristics < ::Form::Subsection def pages @pages ||= [ - Form::Lettings::Pages::Declaration.new(nil, nil, self), + (Form::Lettings::Pages::Declaration.new(nil, nil, self) unless form.start_year_after_2024?), Form::Lettings::Pages::HouseholdMembers.new(nil, nil, self), Form::Lettings::Pages::NoFemalesPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self), Form::Lettings::Pages::FemalesInSoftAgeRangeInPregnantHouseholdLeadHhmembValueCheck.new(nil, nil, self), diff --git a/app/models/form/lettings/subsections/setup.rb b/app/models/form/lettings/subsections/setup.rb index 3b833927d..85af7d2c4 100644 --- a/app/models/form/lettings/subsections/setup.rb +++ b/app/models/form/lettings/subsections/setup.rb @@ -19,6 +19,7 @@ class Form::Lettings::Subsections::Setup < ::Form::Subsection Form::Lettings::Pages::RentType.new(nil, nil, self), Form::Lettings::Pages::TenantCode.new(nil, nil, self), Form::Lettings::Pages::PropertyReference.new(nil, nil, self), + (Form::Lettings::Pages::Declaration.new(nil, nil, self) if form.start_year_after_2024?), ].compact end diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index 187f7f34e..ac006b453 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -9,7 +9,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection def pages @pages ||= [ (Form::Sales::Pages::BuyerInterview.new(nil, nil, self) unless form.start_year_after_2024?), - Form::Sales::Pages::PrivacyNotice.new(nil, nil, self), + (Form::Sales::Pages::PrivacyNotice.new(nil, nil, self) unless form.start_year_after_2024?), Form::Sales::Pages::Age1.new(nil, nil, self), Form::Sales::Pages::RetirementValueCheck.new("age_1_retirement_value_check", nil, self, person_index: 1), Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("age_1_old_persons_shared_ownership_value_check", nil, self), diff --git a/app/models/form/sales/subsections/setup.rb b/app/models/form/sales/subsections/setup.rb index aef107585..49e9392bb 100644 --- a/app/models/form/sales/subsections/setup.rb +++ b/app/models/form/sales/subsections/setup.rb @@ -21,6 +21,7 @@ class Form::Sales::Subsections::Setup < ::Form::Subsection Form::Sales::Pages::JointPurchase.new(nil, nil, self), Form::Sales::Pages::NumberJointBuyers.new(nil, nil, self), (Form::Sales::Pages::BuyerInterview.new(nil, nil, self) if form.start_year_after_2024?), + (Form::Sales::Pages::PrivacyNotice.new(nil, nil, self) if form.start_year_after_2024?), ].flatten.compact end end diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb index 267fa2968..b1ddf8f71 100644 --- a/app/models/form_handler.rb +++ b/app/models/form_handler.rb @@ -52,9 +52,8 @@ class FormHandler def ordered_sales_questions_for_all_years sales_forms = forms.filter { |name, _form| name.end_with? "sales" }.values ordered_questions = sales_forms.pop.questions.uniq(&:id) - question_ids = ordered_questions.map(&:id) all_questions_from_previous_forms = sales_forms.flat_map(&:questions) - deprecated_questions_by_preceding_question_id(question_ids, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| + deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| index_of_preceding_question = ordered_questions.index { |q| q.id == preceding_question_id } ordered_questions.insert(index_of_preceding_question + 1, deprecated_question) end @@ -64,21 +63,26 @@ class FormHandler def ordered_lettings_questions_for_all_years lettings_forms = forms.filter { |name, _form| name.end_with? "lettings" }.values ordered_questions = lettings_forms.pop.questions.uniq(&:id) - question_ids = ordered_questions.map(&:id) all_questions_from_previous_forms = lettings_forms.flat_map(&:questions) - deprecated_questions_by_preceding_question_id(question_ids, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| + deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| index_of_preceding_question = ordered_questions.index { |q| q.id == preceding_question_id } ordered_questions.insert(index_of_preceding_question + 1, deprecated_question) end ordered_questions end - def deprecated_questions_by_preceding_question_id(current_form_question_ids, all_questions_from_previous_forms) + def deprecated_questions_by_preceding_question_id(current_form_questions, all_questions_from_previous_forms) + current_form_question_ids = current_form_questions.map(&:id) deprecated_questions = {} all_questions_from_previous_forms.each_cons(2) do |preceding_question, question| next if current_form_question_ids.include?(question.id) || deprecated_questions.values.map(&:id).include?(question.id) - deprecated_questions[preceding_question.id] = question + if question.subsection.id == preceding_question.subsection.id + deprecated_questions[preceding_question.id] = question + else + last_in_preceding_subsection = current_form_questions.rindex { |q| q.subsection.id == preceding_question.subsection.id } + deprecated_questions[current_form_questions[last_in_preceding_subsection].id] = question + end end deprecated_questions end diff --git a/app/services/bulk_upload/sales/year2024/row_parser.rb b/app/services/bulk_upload/sales/year2024/row_parser.rb index c7a5349d0..0e1ee650e 100644 --- a/app/services/bulk_upload/sales/year2024/row_parser.rb +++ b/app/services/bulk_upload/sales/year2024/row_parser.rb @@ -468,7 +468,6 @@ class BulkUpload::Sales::Year2024::RowParser validate :validate_address_fields, on: :after_log validate :validate_if_log_already_exists, on: :after_log, if: -> { FeatureToggle.bulk_upload_duplicate_log_check_enabled? } - validate :validate_data_protection_answered, on: :after_log validate :validate_buyers_organisations, on: :after_log def self.question_for_field(field) @@ -565,12 +564,6 @@ class BulkUpload::Sales::Year2024::RowParser private - def validate_data_protection_answered - unless field_18 == 1 - errors.add(:field_18, I18n.t("validations.not_answered", question: QUESTIONS[:field_18].downcase), category: :setup) - end - end - def validate_buyers_organisations organisations_fields = %i[field_66 field_67 field_68 field_69] if organisations_fields.all? { |field| attributes[field.to_s].blank? } diff --git a/spec/fixtures/files/lettings_log_csv_export_codes.csv b/spec/fixtures/files/lettings_log_csv_export_codes.csv index c68b53ae2..6fed575a0 100644 --- a/spec/fixtures/files/lettings_log_csv_export_codes.csv +++ b/spec/fixtures/files/lettings_log_csv_export_codes.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,1,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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.csv b/spec/fixtures/files/lettings_log_csv_export_labels.csv index 8722ed90c..388ea962c 100644 --- a/spec/fixtures/files/lettings_log_csv_export_labels.csv +++ b/spec/fixtures/files/lettings_log_csv_export_labels.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,Yes,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv index 6989c0b9b..737ac3432 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,1,4,1,35,F,0,2,13,,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,,2,,0,268,1,6,1,1,,0,2,,,,,200.0,50.0,40.0,35.0,325.0,,,,1,12.0,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,4,1,35,F,0,2,13,,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,,2,,0,268,1,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.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv index 33a852a21..245763282 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,Yes,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,Universal Credit housing element,Yes,All,,No,Every 2 weeks,,,,,200.0,50.0,40.0,35.0,325.0,,,,Yes,12.0,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,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/fixtures/files/sales_logs_csv_export_codes.csv b/spec/fixtures/files/sales_logs_csv_export_codes.csv index ba344fed7..0933ff8d3 100644 --- a/spec/fixtures/files/sales_logs_csv_export_codes.csv +++ b/spec/fixtures/files/sales_logs_csv_export_codes.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,privacynotice,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant -,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,1,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,2,8,,,,1,1,2,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,1,1,0,1,1,30,X,17,17,18,,1,1,P,35,X,17,,13,,1,1,3,C,14,X,9,X,-9,X,3,R,-9,R,10,,,,,1,1,,,0,,,1,1,1,1,,3,,1,4,5,1,1,0,10000,1,0,10000,1,4,1,,1,2,10,,,,,,,,,,,,,,,,,110000.0,,1,20000.0,5,,10,1,80000.0,,,1,100.0,,10000.0 +id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,privacynotice,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant +,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,1,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,2,8,,,,1,1,2,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,1,1,0,1,30,X,17,17,18,,1,1,P,35,X,17,,13,,1,1,3,C,14,X,9,X,-9,X,3,R,-9,R,10,,,,,1,1,,,0,,,1,1,1,1,,3,,1,4,5,1,1,0,10000,1,0,10000,1,4,1,,1,2,10,,,,,,,,,,,,,,,,,110000.0,,1,20000.0,5,,10,1,80000.0,,,1,100.0,,10000.0 diff --git a/spec/fixtures/files/sales_logs_csv_export_labels.csv b/spec/fixtures/files/sales_logs_csv_export_labels.csv index 7ab05f910..9d1413a5a 100644 --- a/spec/fixtures/files/sales_logs_csv_export_labels.csv +++ b/spec/fixtures/files/sales_logs_csv_export_labels.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,privacynotice,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant -,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,single log,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,Yes - a discounted ownership scheme,Right to Acquire (RTA),,,,Yes,Yes,Yes,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,Flat or maisonette,Purpose built,0,Yes,1,30,Non-binary,Buyer 1 prefers not to say,17,United Kingdom,,Full-time - 30 hours or more,Yes,Partner,35,Non-binary,Buyer 2 prefers not to say,,Buyer prefers not to say,,Full-time - 30 hours or more,Yes,3,Child,14,Non-binary,Child under 16,Other,Not known,Non-binary,"In government training into work, such as New Deal",Prefers not to say,Not known,Prefers not to say,Prefers not to say,,,,,Local authority tenant,No,,,No,,,1,1,1,1,,Don't know,,Yes,Yes,No,Yes,Yes,Yes,10000,Yes,Yes,10000,Yes,"Don’t know ",No,,Yes,No,10,,,,,,,,,,,,,,,,,110000.0,,Yes,20000.0,Cambridge Building Society,,10,Yes,80000.0,,,Yes,100.0,,10000.0 +id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,privacynotice,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant +,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,single log,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,Yes - a discounted ownership scheme,Right to Acquire (RTA),,,,Yes,Yes,Yes,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,Flat or maisonette,Purpose built,0,Yes,30,Non-binary,Buyer 1 prefers not to say,17,United Kingdom,,Full-time - 30 hours or more,Yes,Partner,35,Non-binary,Buyer 2 prefers not to say,,Buyer prefers not to say,,Full-time - 30 hours or more,Yes,3,Child,14,Non-binary,Child under 16,Other,Not known,Non-binary,"In government training into work, such as New Deal",Prefers not to say,Not known,Prefers not to say,Prefers not to say,,,,,Local authority tenant,No,,,No,,,1,1,1,1,,Don't know,,Yes,Yes,No,Yes,Yes,Yes,10000,Yes,Yes,10000,Yes,"Don’t know ",No,,Yes,No,10,,,,,,,,,,,,,,,,,110000.0,,Yes,20000.0,Cambridge Building Society,,10,Yes,80000.0,,,Yes,100.0,,10000.0 diff --git a/spec/models/form/lettings/subsections/household_characteristics_spec.rb b/spec/models/form/lettings/subsections/household_characteristics_spec.rb index 4586d5592..34738ed7a 100644 --- a/spec/models/form/lettings/subsections/household_characteristics_spec.rb +++ b/spec/models/form/lettings/subsections/household_characteristics_spec.rb @@ -6,144 +6,295 @@ RSpec.describe Form::Lettings::Subsections::HouseholdCharacteristics, type: :mod let(:subsection_id) { nil } let(:subsection_definition) { nil } let(:section) { instance_double(Form::Lettings::Sections::Household) } + let(:form) { instance_double(Form) } + + before do + allow(section).to receive(:form).and_return(form) + end it "has correct section" do expect(household_characteristics.section).to eq(section) end - it "has correct pages" do - expect(household_characteristics.pages.map(&:id)).to eq( - %w[ - declaration - household_members - no_females_pregnant_household_lead_hhmemb_value_check - females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check - lead_tenant_age - no_females_pregnant_household_lead_age_value_check - females_in_soft_age_range_in_pregnant_household_lead_age_value_check - age_lead_tenant_under_retirement_value_check - age_lead_tenant_over_retirement_value_check - lead_tenant_gender_identity - no_females_pregnant_household_lead_value_check - females_in_soft_age_range_in_pregnant_household_lead_value_check - gender_lead_tenant_over_retirement_value_check - lead_tenant_ethnic_group - lead_tenant_ethnic_background_arab - lead_tenant_ethnic_background_asian - lead_tenant_ethnic_background_black - lead_tenant_ethnic_background_mixed - lead_tenant_ethnic_background_white - lead_tenant_nationality - lead_tenant_working_situation - working_situation_lead_tenant_under_retirement_value_check - working_situation_lead_tenant_over_retirement_value_check - person_2_known - person_2_relationship_to_lead - person_2_age_child - person_2_age_non_child - no_females_pregnant_household_person_2_age_value_check - females_in_soft_age_range_in_pregnant_household_person_2_age_value_check - age_2_under_retirement_value_check - age_2_over_retirement_value_check - person_2_gender_identity - no_females_pregnant_household_person_2_value_check - females_in_soft_age_range_in_pregnant_household_person_2_value_check - gender_2_over_retirement_value_check - person_2_working_situation - working_situation_2_under_retirement_value_check - working_situation_2_over_retirement_value_check - person_3_known - person_3_relationship_to_lead - person_3_age_child - person_3_age_non_child - no_females_pregnant_household_person_3_age_value_check - females_in_soft_age_range_in_pregnant_household_person_3_age_value_check - age_3_under_retirement_value_check - age_3_over_retirement_value_check - person_3_gender_identity - no_females_pregnant_household_person_3_value_check - females_in_soft_age_range_in_pregnant_household_person_3_value_check - gender_3_over_retirement_value_check - person_3_working_situation - working_situation_3_under_retirement_value_check - working_situation_3_over_retirement_value_check - person_4_known - person_4_relationship_to_lead - person_4_age_child - person_4_age_non_child - no_females_pregnant_household_person_4_age_value_check - females_in_soft_age_range_in_pregnant_household_person_4_age_value_check - age_4_under_retirement_value_check - age_4_over_retirement_value_check - person_4_gender_identity - no_females_pregnant_household_person_4_value_check - females_in_soft_age_range_in_pregnant_household_person_4_value_check - gender_4_over_retirement_value_check - person_4_working_situation - working_situation_4_under_retirement_value_check - working_situation_4_over_retirement_value_check - person_5_known - person_5_relationship_to_lead - person_5_age_child - person_5_age_non_child - no_females_pregnant_household_person_5_age_value_check - females_in_soft_age_range_in_pregnant_household_person_5_age_value_check - age_5_under_retirement_value_check - age_5_over_retirement_value_check - person_5_gender_identity - no_females_pregnant_household_person_5_value_check - females_in_soft_age_range_in_pregnant_household_person_5_value_check - gender_5_over_retirement_value_check - person_5_working_situation - working_situation_5_under_retirement_value_check - working_situation_5_over_retirement_value_check - person_6_known - person_6_relationship_to_lead - person_6_age_child - person_6_age_non_child - no_females_pregnant_household_person_6_age_value_check - females_in_soft_age_range_in_pregnant_household_person_6_age_value_check - age_6_under_retirement_value_check - age_6_over_retirement_value_check - person_6_gender_identity - no_females_pregnant_household_person_6_value_check - females_in_soft_age_range_in_pregnant_household_person_6_value_check - gender_6_over_retirement_value_check - person_6_working_situation - working_situation_6_under_retirement_value_check - working_situation_6_over_retirement_value_check - person_7_known - person_7_relationship_to_lead - person_7_age_child - person_7_age_non_child - no_females_pregnant_household_person_7_age_value_check - females_in_soft_age_range_in_pregnant_household_person_7_age_value_check - age_7_under_retirement_value_check - age_7_over_retirement_value_check - person_7_gender_identity - no_females_pregnant_household_person_7_value_check - females_in_soft_age_range_in_pregnant_household_person_7_value_check - gender_7_over_retirement_value_check - person_7_working_situation - working_situation_7_under_retirement_value_check - working_situation_7_over_retirement_value_check - person_8_known - person_8_relationship_to_lead - person_8_age_child - person_8_age_non_child - no_females_pregnant_household_person_8_age_value_check - females_in_soft_age_range_in_pregnant_household_person_8_age_value_check - age_8_under_retirement_value_check - age_8_over_retirement_value_check - person_8_gender_identity - no_females_pregnant_household_person_8_value_check - females_in_soft_age_range_in_pregnant_household_person_8_value_check - gender_8_over_retirement_value_check - person_8_working_situation - working_situation_8_under_retirement_value_check - working_situation_8_over_retirement_value_check - ], - ) + context "with start year before 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + end + + it "has correct pages" do + expect(household_characteristics.pages.map(&:id)).to eq( + %w[ + declaration + household_members + no_females_pregnant_household_lead_hhmemb_value_check + females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check + lead_tenant_age + no_females_pregnant_household_lead_age_value_check + females_in_soft_age_range_in_pregnant_household_lead_age_value_check + age_lead_tenant_under_retirement_value_check + age_lead_tenant_over_retirement_value_check + lead_tenant_gender_identity + no_females_pregnant_household_lead_value_check + females_in_soft_age_range_in_pregnant_household_lead_value_check + gender_lead_tenant_over_retirement_value_check + lead_tenant_ethnic_group + lead_tenant_ethnic_background_arab + lead_tenant_ethnic_background_asian + lead_tenant_ethnic_background_black + lead_tenant_ethnic_background_mixed + lead_tenant_ethnic_background_white + lead_tenant_nationality + lead_tenant_working_situation + working_situation_lead_tenant_under_retirement_value_check + working_situation_lead_tenant_over_retirement_value_check + person_2_known + person_2_relationship_to_lead + person_2_age_child + person_2_age_non_child + no_females_pregnant_household_person_2_age_value_check + females_in_soft_age_range_in_pregnant_household_person_2_age_value_check + age_2_under_retirement_value_check + age_2_over_retirement_value_check + person_2_gender_identity + no_females_pregnant_household_person_2_value_check + females_in_soft_age_range_in_pregnant_household_person_2_value_check + gender_2_over_retirement_value_check + person_2_working_situation + working_situation_2_under_retirement_value_check + working_situation_2_over_retirement_value_check + person_3_known + person_3_relationship_to_lead + person_3_age_child + person_3_age_non_child + no_females_pregnant_household_person_3_age_value_check + females_in_soft_age_range_in_pregnant_household_person_3_age_value_check + age_3_under_retirement_value_check + age_3_over_retirement_value_check + person_3_gender_identity + no_females_pregnant_household_person_3_value_check + females_in_soft_age_range_in_pregnant_household_person_3_value_check + gender_3_over_retirement_value_check + person_3_working_situation + working_situation_3_under_retirement_value_check + working_situation_3_over_retirement_value_check + person_4_known + person_4_relationship_to_lead + person_4_age_child + person_4_age_non_child + no_females_pregnant_household_person_4_age_value_check + females_in_soft_age_range_in_pregnant_household_person_4_age_value_check + age_4_under_retirement_value_check + age_4_over_retirement_value_check + person_4_gender_identity + no_females_pregnant_household_person_4_value_check + females_in_soft_age_range_in_pregnant_household_person_4_value_check + gender_4_over_retirement_value_check + person_4_working_situation + working_situation_4_under_retirement_value_check + working_situation_4_over_retirement_value_check + person_5_known + person_5_relationship_to_lead + person_5_age_child + person_5_age_non_child + no_females_pregnant_household_person_5_age_value_check + females_in_soft_age_range_in_pregnant_household_person_5_age_value_check + age_5_under_retirement_value_check + age_5_over_retirement_value_check + person_5_gender_identity + no_females_pregnant_household_person_5_value_check + females_in_soft_age_range_in_pregnant_household_person_5_value_check + gender_5_over_retirement_value_check + person_5_working_situation + working_situation_5_under_retirement_value_check + working_situation_5_over_retirement_value_check + person_6_known + person_6_relationship_to_lead + person_6_age_child + person_6_age_non_child + no_females_pregnant_household_person_6_age_value_check + females_in_soft_age_range_in_pregnant_household_person_6_age_value_check + age_6_under_retirement_value_check + age_6_over_retirement_value_check + person_6_gender_identity + no_females_pregnant_household_person_6_value_check + females_in_soft_age_range_in_pregnant_household_person_6_value_check + gender_6_over_retirement_value_check + person_6_working_situation + working_situation_6_under_retirement_value_check + working_situation_6_over_retirement_value_check + person_7_known + person_7_relationship_to_lead + person_7_age_child + person_7_age_non_child + no_females_pregnant_household_person_7_age_value_check + females_in_soft_age_range_in_pregnant_household_person_7_age_value_check + age_7_under_retirement_value_check + age_7_over_retirement_value_check + person_7_gender_identity + no_females_pregnant_household_person_7_value_check + females_in_soft_age_range_in_pregnant_household_person_7_value_check + gender_7_over_retirement_value_check + person_7_working_situation + working_situation_7_under_retirement_value_check + working_situation_7_over_retirement_value_check + person_8_known + person_8_relationship_to_lead + person_8_age_child + person_8_age_non_child + no_females_pregnant_household_person_8_age_value_check + females_in_soft_age_range_in_pregnant_household_person_8_age_value_check + age_8_under_retirement_value_check + age_8_over_retirement_value_check + person_8_gender_identity + no_females_pregnant_household_person_8_value_check + females_in_soft_age_range_in_pregnant_household_person_8_value_check + gender_8_over_retirement_value_check + person_8_working_situation + working_situation_8_under_retirement_value_check + working_situation_8_over_retirement_value_check + ], + ) + end + end + + context "with start year >= 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end + + it "has correct pages" do + expect(household_characteristics.pages.map(&:id)).to eq( + %w[ + household_members + no_females_pregnant_household_lead_hhmemb_value_check + females_in_soft_age_range_in_pregnant_household_lead_hhmemb_value_check + lead_tenant_age + no_females_pregnant_household_lead_age_value_check + females_in_soft_age_range_in_pregnant_household_lead_age_value_check + age_lead_tenant_under_retirement_value_check + age_lead_tenant_over_retirement_value_check + lead_tenant_gender_identity + no_females_pregnant_household_lead_value_check + females_in_soft_age_range_in_pregnant_household_lead_value_check + gender_lead_tenant_over_retirement_value_check + lead_tenant_ethnic_group + lead_tenant_ethnic_background_arab + lead_tenant_ethnic_background_asian + lead_tenant_ethnic_background_black + lead_tenant_ethnic_background_mixed + lead_tenant_ethnic_background_white + lead_tenant_nationality + lead_tenant_working_situation + working_situation_lead_tenant_under_retirement_value_check + working_situation_lead_tenant_over_retirement_value_check + person_2_known + person_2_relationship_to_lead + person_2_age_child + person_2_age_non_child + no_females_pregnant_household_person_2_age_value_check + females_in_soft_age_range_in_pregnant_household_person_2_age_value_check + age_2_under_retirement_value_check + age_2_over_retirement_value_check + person_2_gender_identity + no_females_pregnant_household_person_2_value_check + females_in_soft_age_range_in_pregnant_household_person_2_value_check + gender_2_over_retirement_value_check + person_2_working_situation + working_situation_2_under_retirement_value_check + working_situation_2_over_retirement_value_check + person_3_known + person_3_relationship_to_lead + person_3_age_child + person_3_age_non_child + no_females_pregnant_household_person_3_age_value_check + females_in_soft_age_range_in_pregnant_household_person_3_age_value_check + age_3_under_retirement_value_check + age_3_over_retirement_value_check + person_3_gender_identity + no_females_pregnant_household_person_3_value_check + females_in_soft_age_range_in_pregnant_household_person_3_value_check + gender_3_over_retirement_value_check + person_3_working_situation + working_situation_3_under_retirement_value_check + working_situation_3_over_retirement_value_check + person_4_known + person_4_relationship_to_lead + person_4_age_child + person_4_age_non_child + no_females_pregnant_household_person_4_age_value_check + females_in_soft_age_range_in_pregnant_household_person_4_age_value_check + age_4_under_retirement_value_check + age_4_over_retirement_value_check + person_4_gender_identity + no_females_pregnant_household_person_4_value_check + females_in_soft_age_range_in_pregnant_household_person_4_value_check + gender_4_over_retirement_value_check + person_4_working_situation + working_situation_4_under_retirement_value_check + working_situation_4_over_retirement_value_check + person_5_known + person_5_relationship_to_lead + person_5_age_child + person_5_age_non_child + no_females_pregnant_household_person_5_age_value_check + females_in_soft_age_range_in_pregnant_household_person_5_age_value_check + age_5_under_retirement_value_check + age_5_over_retirement_value_check + person_5_gender_identity + no_females_pregnant_household_person_5_value_check + females_in_soft_age_range_in_pregnant_household_person_5_value_check + gender_5_over_retirement_value_check + person_5_working_situation + working_situation_5_under_retirement_value_check + working_situation_5_over_retirement_value_check + person_6_known + person_6_relationship_to_lead + person_6_age_child + person_6_age_non_child + no_females_pregnant_household_person_6_age_value_check + females_in_soft_age_range_in_pregnant_household_person_6_age_value_check + age_6_under_retirement_value_check + age_6_over_retirement_value_check + person_6_gender_identity + no_females_pregnant_household_person_6_value_check + females_in_soft_age_range_in_pregnant_household_person_6_value_check + gender_6_over_retirement_value_check + person_6_working_situation + working_situation_6_under_retirement_value_check + working_situation_6_over_retirement_value_check + person_7_known + person_7_relationship_to_lead + person_7_age_child + person_7_age_non_child + no_females_pregnant_household_person_7_age_value_check + females_in_soft_age_range_in_pregnant_household_person_7_age_value_check + age_7_under_retirement_value_check + age_7_over_retirement_value_check + person_7_gender_identity + no_females_pregnant_household_person_7_value_check + females_in_soft_age_range_in_pregnant_household_person_7_value_check + gender_7_over_retirement_value_check + person_7_working_situation + working_situation_7_under_retirement_value_check + working_situation_7_over_retirement_value_check + person_8_known + person_8_relationship_to_lead + person_8_age_child + person_8_age_non_child + no_females_pregnant_household_person_8_age_value_check + females_in_soft_age_range_in_pregnant_household_person_8_age_value_check + age_8_under_retirement_value_check + age_8_over_retirement_value_check + person_8_gender_identity + no_females_pregnant_household_person_8_value_check + females_in_soft_age_range_in_pregnant_household_person_8_value_check + gender_8_over_retirement_value_check + person_8_working_situation + working_situation_8_under_retirement_value_check + working_situation_8_over_retirement_value_check + ], + ) + end end it "has the correct id" do diff --git a/spec/models/form/lettings/subsections/setup_spec.rb b/spec/models/form/lettings/subsections/setup_spec.rb index d7da750a8..b31cb61c5 100644 --- a/spec/models/form/lettings/subsections/setup_spec.rb +++ b/spec/models/form/lettings/subsections/setup_spec.rb @@ -6,38 +6,45 @@ RSpec.describe Form::Lettings::Subsections::Setup, type: :model do let(:subsection_id) { nil } let(:subsection_definition) { nil } let(:section) { instance_double(Form::Lettings::Sections::Setup) } + let(:form) { instance_double(Form) } + + before do + allow(section).to receive(:form).and_return(form) + end it "has correct section" do expect(setup.section).to eq(section) end - it "has correct pages" do - expect(setup.pages.map(&:id)).to eq( - %w[ - stock_owner - managing_organisation - created_by - needs_type - scheme - location - renewal - tenancy_start_date - rent_type - tenant_code - property_reference - ], - ) - end + context "with start year before 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + end - it "has the correct id" do - expect(setup.id).to eq("setup") + it "has correct pages" do + expect(setup.pages.map(&:id)).to eq( + %w[ + stock_owner + managing_organisation + created_by + needs_type + scheme + location + renewal + tenancy_start_date + rent_type + tenant_code + property_reference + ], + ) + end end - it "has the correct label" do - expect(setup.label).to eq("Set up this lettings log") - end + context "with start year >= 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end - context "when not production" do it "has correct pages" do expect(setup.pages.map(&:id)).to eq( %w[ @@ -52,8 +59,17 @@ RSpec.describe Form::Lettings::Subsections::Setup, type: :model do rent_type tenant_code property_reference + declaration ], ) end end + + it "has the correct id" do + expect(setup.id).to eq("setup") + end + + it "has the correct label" do + expect(setup.label).to eq("Set up this lettings log") + end end diff --git a/spec/models/form/sales/pages/privacy_notice_spec.rb b/spec/models/form/sales/pages/privacy_notice_spec.rb index d8e25a3d8..9c2ce1a64 100644 --- a/spec/models/form/sales/pages/privacy_notice_spec.rb +++ b/spec/models/form/sales/pages/privacy_notice_spec.rb @@ -6,6 +6,12 @@ RSpec.describe Form::Sales::Pages::PrivacyNotice, type: :model do let(:page_id) { nil } let(:page_definition) { nil } let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form) } + + before do + allow(subsection).to receive(:form).and_return(form) + allow(form).to receive(:start_year_after_2024?) + end it "has correct subsection" do expect(page.subsection).to eq(subsection) diff --git a/spec/models/form/sales/subsections/household_characteristics_spec.rb b/spec/models/form/sales/subsections/household_characteristics_spec.rb index 00e96450f..842dec8bc 100644 --- a/spec/models/form/sales/subsections/household_characteristics_spec.rb +++ b/spec/models/form/sales/subsections/household_characteristics_spec.rb @@ -240,7 +240,6 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model it "has correct pages" do expect(household_characteristics.pages.map(&:id)).to eq( %w[ - privacy_notice buyer_1_age age_1_retirement_value_check age_1_old_persons_shared_ownership_value_check diff --git a/spec/models/form/sales/subsections/setup_spec.rb b/spec/models/form/sales/subsections/setup_spec.rb index 2ddb64e19..eb92e3753 100644 --- a/spec/models/form/sales/subsections/setup_spec.rb +++ b/spec/models/form/sales/subsections/setup_spec.rb @@ -68,6 +68,7 @@ RSpec.describe Form::Sales::Subsections::Setup, type: :model do joint_purchase number_joint_buyers buyer_interview + privacy_notice ], ) end From 2d83feadb4b5363290a5d66111d787e7903f17d7 Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Thu, 8 Feb 2024 12:28:57 +0000 Subject: [PATCH 08/16] CLDC-3126: Update privacy notice question wording --- .../form/lettings/questions/declaration.rb | 13 ++- .../form/sales/questions/privacy_notice.rb | 15 ++-- .../guidance/_privacy_notice_buyer_2024.erb | 1 + .../guidance/_privacy_notice_tenant_2024.erb | 1 + .../lettings/questions/declaration_spec.rb | 81 +++++++++++++++++++ .../sales/questions/privacy_notice_spec.rb | 42 +++++++++- 6 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 app/views/form/guidance/_privacy_notice_buyer_2024.erb create mode 100644 app/views/form/guidance/_privacy_notice_tenant_2024.erb create mode 100644 spec/models/form/lettings/questions/declaration_spec.rb diff --git a/app/models/form/lettings/questions/declaration.rb b/app/models/form/lettings/questions/declaration.rb index 03fc72f4a..4805a9f1e 100644 --- a/app/models/form/lettings/questions/declaration.rb +++ b/app/models/form/lettings/questions/declaration.rb @@ -6,10 +6,17 @@ class Form::Lettings::Questions::Declaration < ::Form::Question @header = "Declaration" @type = "checkbox" @check_answers_card_number = 0 - @top_guidance_partial = "privacy_notice_tenant" - @answer_options = ANSWER_OPTIONS + @top_guidance_partial = form.start_year_after_2024? ? "privacy_notice_tenant_2024" : "privacy_notice_tenant" @question_number = 30 end - ANSWER_OPTIONS = { "declaration" => { "value" => "The tenant has seen the DLUHC privacy notice" } }.freeze + def answer_options + declaration_text = if form.start_year_after_2024? + "The tenant has seen or been given access to the DLUHC privacy notice" + else + "The tenant has seen the DLUHC privacy notice" + end + + { "declaration" => { "value" => declaration_text } }.freeze + end end diff --git a/app/models/form/sales/questions/privacy_notice.rb b/app/models/form/sales/questions/privacy_notice.rb index d440e414b..62eab5d8f 100644 --- a/app/models/form/sales/questions/privacy_notice.rb +++ b/app/models/form/sales/questions/privacy_notice.rb @@ -5,12 +5,17 @@ class Form::Sales::Questions::PrivacyNotice < ::Form::Question @check_answer_label = "Buyer has seen the privacy notice?" @header = "Declaration" @type = "checkbox" - @answer_options = ANSWER_OPTIONS - @top_guidance_partial = "privacy_notice_buyer" + @top_guidance_partial = form.start_year_after_2024? ? "privacy_notice_buyer_2024" : "privacy_notice_buyer" @question_number = 19 end - ANSWER_OPTIONS = { - "privacynotice" => { "value" => "The buyer has seen the DLUHC privacy notice" }, - }.freeze + def answer_options + declaration_text = if form.start_year_after_2024? + "The buyer has seen or been given access to the DLUHC privacy notice" + else + "The buyer has seen the DLUHC privacy notice" + end + + { "privacynotice" => { "value" => declaration_text } }.freeze + end end diff --git a/app/views/form/guidance/_privacy_notice_buyer_2024.erb b/app/views/form/guidance/_privacy_notice_buyer_2024.erb new file mode 100644 index 000000000..9977bf20b --- /dev/null +++ b/app/views/form/guidance/_privacy_notice_buyer_2024.erb @@ -0,0 +1 @@ +

Make sure the buyer has seen or been given access to <%= govuk_link_to "the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice", privacy_notice_path, target: :_blank %> before completing this log. This is a legal requirement under data protection legislation.

diff --git a/app/views/form/guidance/_privacy_notice_tenant_2024.erb b/app/views/form/guidance/_privacy_notice_tenant_2024.erb new file mode 100644 index 000000000..3007c8904 --- /dev/null +++ b/app/views/form/guidance/_privacy_notice_tenant_2024.erb @@ -0,0 +1 @@ +

Make sure the lead tenant has seen or been given access to <%= govuk_link_to "the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice", privacy_notice_path, target: :_blank %> before completing this log. This is a legal requirement under data protection legislation.

diff --git a/spec/models/form/lettings/questions/declaration_spec.rb b/spec/models/form/lettings/questions/declaration_spec.rb new file mode 100644 index 000000000..4a22ea453 --- /dev/null +++ b/spec/models/form/lettings/questions/declaration_spec.rb @@ -0,0 +1,81 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::Declaration, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form) } + + before do + allow(form).to receive(:start_year_after_2024?) + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("declaration") + end + + it "has the correct header" do + expect(question.header).to eq("Declaration") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Tenant has seen the privacy notice") + end + + it "has the correct type" do + expect(question.type).to eq("checkbox") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + it "has the correct hint" do + expect(question.hint_text).to be_nil + end + + context "when the form year is before 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "declaration" => { "value" => "The tenant has seen the DLUHC privacy notice" }, + }) + end + + it "uses the expected top guidance partial" do + expect(question.top_guidance_partial).to eq("privacy_notice_tenant") + end + end + + context "when the form year is >= 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "declaration" => { "value" => "The tenant has seen or been given access to the DLUHC privacy notice" }, + }) + end + + it "uses the expected top guidance partial" do + expect(question.top_guidance_partial).to eq("privacy_notice_tenant_2024") + end + end + + it "returns correct unanswered_error_message" do + expect(question.unanswered_error_message).to eq("You must show the DLUHC privacy notice to the tenant before you can submit this log.") + end +end diff --git a/spec/models/form/sales/questions/privacy_notice_spec.rb b/spec/models/form/sales/questions/privacy_notice_spec.rb index 1fec22b6e..c37f6f920 100644 --- a/spec/models/form/sales/questions/privacy_notice_spec.rb +++ b/spec/models/form/sales/questions/privacy_notice_spec.rb @@ -6,6 +6,14 @@ RSpec.describe Form::Sales::Questions::PrivacyNotice, type: :model do let(:question_id) { nil } let(:question_definition) { nil } let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form) } + + before do + allow(form).to receive(:start_year_after_2024?) + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end it "has correct page" do expect(question.page).to eq(page) @@ -35,10 +43,36 @@ RSpec.describe Form::Sales::Questions::PrivacyNotice, type: :model do expect(question.hint_text).to be_nil end - it "has the correct answer_options" do - expect(question.answer_options).to eq({ - "privacynotice" => { "value" => "The buyer has seen the DLUHC privacy notice" }, - }) + context "when the form year is before 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "privacynotice" => { "value" => "The buyer has seen the DLUHC privacy notice" }, + }) + end + + it "uses the expected top guidance partial" do + expect(question.top_guidance_partial).to eq("privacy_notice_buyer") + end + end + + context "when the form year is >= 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "privacynotice" => { "value" => "The buyer has seen or been given access to the DLUHC privacy notice" }, + }) + end + + it "uses the expected top guidance partial" do + expect(question.top_guidance_partial).to eq("privacy_notice_buyer_2024") + end end it "returns correct unanswered_error_message" do From f9583df08d049373085a3a7492565b6a0b328185 Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Thu, 8 Feb 2024 10:58:58 +0000 Subject: [PATCH 09/16] CLDC-3126: Update csv ordering to base on current form and consider subsection boundaries --- app/models/form_handler.rb | 16 +- .../lettings_log_csv_export_codes_23.csv | 2 + ...v => lettings_log_csv_export_codes_24.csv} | 2 +- .../lettings_log_csv_export_labels_23.csv | 2 + ... => lettings_log_csv_export_labels_24.csv} | 2 +- ...gs_log_csv_export_non_support_codes_23.csv | 2 + ...s_log_csv_export_non_support_codes_24.csv} | 2 +- ...s_log_csv_export_non_support_labels_23.csv | 2 + ..._log_csv_export_non_support_labels_24.csv} | 2 +- .../files/sales_logs_csv_export_codes_23.csv | 2 + ...csv => sales_logs_csv_export_codes_24.csv} | 2 +- .../files/sales_logs_csv_export_labels_23.csv | 2 + ...sv => sales_logs_csv_export_labels_24.csv} | 2 +- spec/models/form_handler_spec.rb | 94 ++++++++++-- .../csv/lettings_log_csv_service_spec.rb | 141 +++++++++++++----- .../csv/sales_log_csv_service_spec.rb | 73 +++++++-- 16 files changed, 274 insertions(+), 74 deletions(-) create mode 100644 spec/fixtures/files/lettings_log_csv_export_codes_23.csv rename spec/fixtures/files/{lettings_log_csv_export_codes.csv => lettings_log_csv_export_codes_24.csv} (97%) create mode 100644 spec/fixtures/files/lettings_log_csv_export_labels_23.csv rename spec/fixtures/files/{lettings_log_csv_export_labels.csv => lettings_log_csv_export_labels_24.csv} (98%) create mode 100644 spec/fixtures/files/lettings_log_csv_export_non_support_codes_23.csv rename spec/fixtures/files/{lettings_log_csv_export_non_support_codes.csv => lettings_log_csv_export_non_support_codes_24.csv} (97%) create mode 100644 spec/fixtures/files/lettings_log_csv_export_non_support_labels_23.csv rename spec/fixtures/files/{lettings_log_csv_export_non_support_labels.csv => lettings_log_csv_export_non_support_labels_24.csv} (98%) create mode 100644 spec/fixtures/files/sales_logs_csv_export_codes_23.csv rename spec/fixtures/files/{sales_logs_csv_export_codes.csv => sales_logs_csv_export_codes_24.csv} (96%) create mode 100644 spec/fixtures/files/sales_logs_csv_export_labels_23.csv rename spec/fixtures/files/{sales_logs_csv_export_labels.csv => sales_logs_csv_export_labels_24.csv} (97%) diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb index b1ddf8f71..32968fa53 100644 --- a/app/models/form_handler.rb +++ b/app/models/form_handler.rb @@ -50,10 +50,10 @@ class FormHandler end def ordered_sales_questions_for_all_years - sales_forms = forms.filter { |name, _form| name.end_with? "sales" }.values - ordered_questions = sales_forms.pop.questions.uniq(&:id) - all_questions_from_previous_forms = sales_forms.flat_map(&:questions) - deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| + ordered_questions = current_sales_form.questions.uniq(&:id) + all_sales_forms = forms.filter { |name, _form| name.end_with? "sales" }.values + all_questions_from_available_sales_forms = all_sales_forms.flat_map(&:questions) + deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_available_sales_forms).each do |preceding_question_id, deprecated_question| index_of_preceding_question = ordered_questions.index { |q| q.id == preceding_question_id } ordered_questions.insert(index_of_preceding_question + 1, deprecated_question) end @@ -61,10 +61,10 @@ class FormHandler end def ordered_lettings_questions_for_all_years - lettings_forms = forms.filter { |name, _form| name.end_with? "lettings" }.values - ordered_questions = lettings_forms.pop.questions.uniq(&:id) - all_questions_from_previous_forms = lettings_forms.flat_map(&:questions) - deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_previous_forms).each do |preceding_question_id, deprecated_question| + ordered_questions = current_lettings_form.questions.uniq(&:id) + all_lettings_forms = forms.filter { |name, _form| name.end_with? "lettings" }.values + all_questions_from_available_lettings_forms = all_lettings_forms.flat_map(&:questions) + deprecated_questions_by_preceding_question_id(ordered_questions, all_questions_from_available_lettings_forms).each do |preceding_question_id, deprecated_question| index_of_preceding_question = ordered_questions.index { |q| q.id == preceding_question_id } ordered_questions.insert(index_of_preceding_question + 1, deprecated_question) end diff --git a/spec/fixtures/files/lettings_log_csv_export_codes_23.csv b/spec/fixtures/files/lettings_log_csv_export_codes_23.csv new file mode 100644 index 000000000..873c703b0 --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_codes_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,nationality_all,national,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,1,4,,1,4,0,0,2,35,,F,0,2,,13,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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_codes.csv b/spec/fixtures/files/lettings_log_csv_export_codes_24.csv similarity index 97% rename from spec/fixtures/files/lettings_log_csv_export_codes.csv rename to spec/fixtures/files/lettings_log_csv_export_codes_24.csv index 6fed575a0..82b91798f 100644 --- a/spec/fixtures/files/lettings_log_csv_export_codes.csv +++ b/spec/fixtures/files/lettings_log_csv_export_codes_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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,,,,,,,,,,,,,,,,,,,, +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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_23.csv b/spec/fixtures/files/lettings_log_csv_export_labels_23.csv new file mode 100644 index 000000000..a9c491ed9 --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_labels_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,nationality_all,national,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,Yes,4,,Yes,4,0,0,2,35,,Female,White,Irish,,Tenant prefers not to say,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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_labels.csv b/spec/fixtures/files/lettings_log_csv_export_labels_24.csv similarity index 98% rename from spec/fixtures/files/lettings_log_csv_export_labels.csv rename to spec/fixtures/files/lettings_log_csv_export_labels_24.csv index 388ea962c..4ece610dd 100644 --- a/spec/fixtures/files/lettings_log_csv_export_labels.csv +++ b/spec/fixtures/files/lettings_log_csv_export_labels_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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,,,,,,,,,,,,,,,,,,,, +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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_23.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_23.csv new file mode 100644 index 000000000..2cf49f785 --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,refused,age1,sex1,ethnic_group,ethnic,nationality_all,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,1,4,1,35,F,0,2,,13,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,,2,,0,268,1,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_codes.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv similarity index 97% rename from spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv rename to spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv index 737ac3432..c796f49d7 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,4,1,35,F,0,2,13,,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,,2,,0,268,1,6,1,1,,0,2,,,,,200.0,50.0,40.0,35.0,325.0,,,,1,12.0,,,,,,,,,,,,,,,,,,,, +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,4,1,35,F,0,2,13,,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,,2,,0,268,1,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_23.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_23.csv new file mode 100644 index 000000000..2c2b63ee4 --- /dev/null +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,declaration,hhmemb,refused,age1,sex1,ethnic_group,ethnic,nationality_all,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,Yes,4,Yes,35,Female,White,Irish,,Tenant prefers not to say,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,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/fixtures/files/lettings_log_csv_export_non_support_labels.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv similarity index 98% rename from spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv rename to spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv index 245763282..572e034cc 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2023-11-26T00:00:00+00:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,Universal Credit housing element,Yes,All,,No,Every 2 weeks,,,,,200.0,50.0,40.0,35.0,325.0,,,,Yes,12.0,,,,,,,,,,,,,,,,,,,, +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,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/fixtures/files/sales_logs_csv_export_codes_23.csv b/spec/fixtures/files/sales_logs_csv_export_codes_23.csv new file mode 100644 index 000000000..ae93dd76c --- /dev/null +++ b/spec/fixtures/files/sales_logs_csv_export_codes_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,beds,proptype,builtype,pcodenk,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,wchair,noint,privacynotice,age1,sex1,ethnic_group,ethnic,nationality_all,national,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationality_all_buyer2,nationalbuy2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant +,completed,,2023-12-08T00:00:00+00:00,2024-01-01T00:00:00+00:00,,2023,1,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,2,8,,,,1,1,2,1,1,0,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,1,2,1,30,X,17,17,,18,1,1,P,35,X,17,,,13,1,1,3,C,14,X,9,X,-9,X,3,R,-9,R,10,,,,,1,1,,,0,,,1,1,1,1,,3,,1,4,5,1,1,0,10000,1,0,10000,1,4,1,,1,2,10,,,,,,,,,,,,,,,,,110000.0,,1,20000.0,5,,10,1,80000.0,,,1,100.0,,10000.0 diff --git a/spec/fixtures/files/sales_logs_csv_export_codes.csv b/spec/fixtures/files/sales_logs_csv_export_codes_24.csv similarity index 96% rename from spec/fixtures/files/sales_logs_csv_export_codes.csv rename to spec/fixtures/files/sales_logs_csv_export_codes_24.csv index 0933ff8d3..cdce0a509 100644 --- a/spec/fixtures/files/sales_logs_csv_export_codes.csv +++ b/spec/fixtures/files/sales_logs_csv_export_codes_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,privacynotice,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant -,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,1,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,2,8,,,,1,1,2,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,1,1,0,1,30,X,17,17,18,,1,1,P,35,X,17,,13,,1,1,3,C,14,X,9,X,-9,X,3,R,-9,R,10,,,,,1,1,,,0,,,1,1,1,1,,3,,1,4,5,1,1,0,10000,1,0,10000,1,4,1,,1,2,10,,,,,,,,,,,,,,,,,110000.0,,1,20000.0,5,,10,1,80000.0,,,1,100.0,,10000.0 +,completed,,2023-12-08T00:00:00+00:00,2024-05-01T00:00:00+01:00,,2023,1,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,2,8,,,,1,1,2,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,1,1,0,1,30,X,17,17,18,,1,1,P,35,X,17,,13,,1,1,3,C,14,X,9,X,-9,X,3,R,-9,R,10,,,,,1,1,,,0,,,1,1,1,1,,3,,1,4,5,1,1,0,10000,1,0,10000,1,4,1,,1,2,10,,,,,,,,,,,,,,,,,110000.0,,1,20000.0,5,,10,1,80000.0,,,1,100.0,,10000.0 diff --git a/spec/fixtures/files/sales_logs_csv_export_labels_23.csv b/spec/fixtures/files/sales_logs_csv_export_labels_23.csv new file mode 100644 index 000000000..e0e986df2 --- /dev/null +++ b/spec/fixtures/files/sales_logs_csv_export_labels_23.csv @@ -0,0 +1,2 @@ +id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,beds,proptype,builtype,pcodenk,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,wchair,noint,privacynotice,age1,sex1,ethnic_group,ethnic,nationality_all,national,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationality_all_buyer2,nationalbuy2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant +,completed,,2023-12-08T00:00:00+00:00,2024-01-01T00:00:00+00:00,,2023,single log,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,Yes - a discounted ownership scheme,Right to Acquire (RTA),,,,Yes,Yes,2,Flat or maisonette,Purpose built,0,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,Yes,Yes,1,30,Non-binary,Buyer 1 prefers not to say,17,,United Kingdom,Full-time - 30 hours or more,Yes,Partner,35,Non-binary,Buyer 2 prefers not to say,,,Buyer prefers not to say,Full-time - 30 hours or more,Yes,3,Child,14,Non-binary,Child under 16,Other,Not known,Non-binary,"In government training into work, such as New Deal",Prefers not to say,Not known,Prefers not to say,Prefers not to say,,,,,Local authority tenant,No,,,No,,,1,1,1,1,,Don't know,,Yes,Yes,No,Yes,Yes,Yes,10000,Yes,Yes,10000,Yes,"Don’t know ",No,,Yes,No,10,,,,,,,,,,,,,,,,,110000.0,,Yes,20000.0,Cambridge Building Society,,10,Yes,80000.0,,,Yes,100.0,,10000.0 diff --git a/spec/fixtures/files/sales_logs_csv_export_labels.csv b/spec/fixtures/files/sales_logs_csv_export_labels_24.csv similarity index 97% rename from spec/fixtures/files/sales_logs_csv_export_labels.csv rename to spec/fixtures/files/sales_logs_csv_export_labels_24.csv index 9d1413a5a..2bd4670ec 100644 --- a/spec/fixtures/files/sales_logs_csv_export_labels.csv +++ b/spec/fixtures/files/sales_logs_csv_export_labels_24.csv @@ -1,2 +1,2 @@ id,status,duplicate_set_id,created_at,updated_at,old_form_id,collection_start_year,creation_method,is_dpo,owning_organisation_name,managing_organisation_name,created_by,day,month,year,purchid,ownershipsch,type,othtype,companybuy,buylivein,jointpur,jointmore,noint,privacynotice,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,pcode1,pcode2,la_known,la,la_label,beds,proptype,builtype,pcodenk,wchair,age1,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,buy1livein,relat2,age2,sex2,ethnic_group2,ethnicbuy2,nationalbuy2,nationality_all_buyer2,ecstat2,buy2livein,hholdcount,relat3,age3,sex3,ecstat3,relat4,age4,sex4,ecstat4,relat5,age5,sex5,ecstat5,relat6,age6,sex6,ecstat6,prevten,ppcodenk,ppostc1,ppostc2,previous_la_known,prevloc,prevloc_label,pregyrha,pregother,pregla,pregghb,pregblank,buy2living,prevtenbuy2,hhregres,hhregresstill,armedforcesspouse,disabled,wheel,income1nk,income1,inc1mort,income2nk,income2,inc2mort,hb,savingsnk,savings,prevown,prevshared,proplen,staircase,stairbought,stairowned,staircasesale,resale,exday,exmonth,exyear,hoday,homonth,hoyear,lanomagr,soctenant,frombeds,fromprop,socprevten,value,equity,mortgageused,mortgage,mortgagelender,mortgagelenderother,mortlen,extrabor,deposit,cashdis,mrent,has_mscharge,mscharge,discount,grant -,completed,,2023-12-08T00:00:00+00:00,2023-12-08T00:00:00+00:00,,2023,single log,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,Yes - a discounted ownership scheme,Right to Acquire (RTA),,,,Yes,Yes,Yes,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,Flat or maisonette,Purpose built,0,Yes,30,Non-binary,Buyer 1 prefers not to say,17,United Kingdom,,Full-time - 30 hours or more,Yes,Partner,35,Non-binary,Buyer 2 prefers not to say,,Buyer prefers not to say,,Full-time - 30 hours or more,Yes,3,Child,14,Non-binary,Child under 16,Other,Not known,Non-binary,"In government training into work, such as New Deal",Prefers not to say,Not known,Prefers not to say,Prefers not to say,,,,,Local authority tenant,No,,,No,,,1,1,1,1,,Don't know,,Yes,Yes,No,Yes,Yes,Yes,10000,Yes,Yes,10000,Yes,"Don’t know ",No,,Yes,No,10,,,,,,,,,,,,,,,,,110000.0,,Yes,20000.0,Cambridge Building Society,,10,Yes,80000.0,,,Yes,100.0,,10000.0 +,completed,,2023-12-08T00:00:00+00:00,2024-05-01T00:00:00+01:00,,2023,single log,false,DLUHC,DLUHC,billyboy@eyeklaud.com,8,12,2023,,Yes - a discounted ownership scheme,Right to Acquire (RTA),,,,Yes,Yes,Yes,1,,,Address line 1,,Town or city,,SW1A,1AA,1,E09000003,Barnet,2,Flat or maisonette,Purpose built,0,Yes,30,Non-binary,Buyer 1 prefers not to say,17,United Kingdom,,Full-time - 30 hours or more,Yes,Partner,35,Non-binary,Buyer 2 prefers not to say,,Buyer prefers not to say,,Full-time - 30 hours or more,Yes,3,Child,14,Non-binary,Child under 16,Other,Not known,Non-binary,"In government training into work, such as New Deal",Prefers not to say,Not known,Prefers not to say,Prefers not to say,,,,,Local authority tenant,No,,,No,,,1,1,1,1,,Don't know,,Yes,Yes,No,Yes,Yes,Yes,10000,Yes,Yes,10000,Yes,"Don’t know ",No,,Yes,No,10,,,,,,,,,,,,,,,,,110000.0,,Yes,20000.0,Cambridge Building Society,,10,Yes,80000.0,,,Yes,100.0,,10000.0 diff --git a/spec/models/form_handler_spec.rb b/spec/models/form_handler_spec.rb index fe340f71b..257c41b43 100644 --- a/spec/models/form_handler_spec.rb +++ b/spec/models/form_handler_spec.rb @@ -271,7 +271,7 @@ RSpec.describe FormHandler do sales_form = FormFactory.new(year: 1936, type: "sales") .with_sections([section]) .build - described_class.instance.use_fake_forms!({ only_sales: sales_form }) + described_class.instance.use_fake_forms!({ "current_sales" => sales_form }) expect(result).to(satisfy { |result| result.all? { |element| element.is_a?(Form::Question) } }) end @@ -281,7 +281,7 @@ RSpec.describe FormHandler do sales_form = FormFactory.new(year: 1936, type: "sales") .with_sections([first_section, second_section]) .build - described_class.instance.use_fake_forms!({ only_sales: sales_form }) + described_class.instance.use_fake_forms!({ "current_sales" => sales_form }) expect(result.map(&:id)).to eq %w[1 2 3 4 5] end @@ -291,7 +291,7 @@ RSpec.describe FormHandler do sales_form = FormFactory.new(year: 1945, type: "sales") .with_sections([first_section, second_section]) .build - described_class.instance.use_fake_forms!({ only_sales: sales_form }) + described_class.instance.use_fake_forms!({ "current_sales" => sales_form }) expect(result.map(&:id)).to eq %w[1 2 3 4 5 6] end @@ -305,12 +305,49 @@ RSpec.describe FormHandler do .with_sections([new_section]) .build fake_forms = { - earlier_sales: original_form, - newer_sales: new_form, + "previous_sales" => original_form, + "current_sales" => new_form, } described_class.instance.use_fake_forms!(fake_forms) expect(result.map(&:id)).to eq %w[1 1a_deprecated 2 2a_new 3] end + + it "inserts questions from previous years that would start a section after new questions in the previous section" do + original_first_section = build(:section) + original_first_section.subsections = [build(:subsection, :with_questions, question_ids: %w[1 2], id: "1", section: original_first_section)] + new_first_section = build(:section) + new_first_section.subsections = [build(:subsection, :with_questions, question_ids: %w[1 2 extra], id: "1", section: new_first_section)] + original_second_section = build(:section) + original_second_section.subsections = [build(:subsection, :with_questions, question_ids: %w[3 4], id: "2")] + new_second_section = build(:section) + new_second_section.subsections = [build(:subsection, :with_questions, question_ids: %w[3_new 4], id: "2")] + + original_form = FormFactory.new(year: 2022, type: "sales").with_sections([original_first_section, original_second_section]).build + new_form = FormFactory.new(year: 2023, type: "sales").with_sections([new_first_section, new_second_section]).build + + fake_forms = { + "current_sales" => new_form, + "previous_sales" => original_form, + } + described_class.instance.use_fake_forms!(fake_forms) + expect(result.map(&:id)).to eq %w[1 2 extra 3 3_new 4] + end + + it "builds the ordering based on the current form" do + archived_section = build(:section, :with_questions, question_ids: %w[0 1 2 3]) + previous_section = build(:section, :with_questions, question_ids: %w[0 1 3 2]) + current_section = build(:section, :with_questions, question_ids: %w[3 2 0 1]) + next_section = build(:section, :with_questions, question_ids: %w[3 2 1 0]) + + fake_forms = { + "current_sales" => FormFactory.new(year: 2023, type: "sales").with_sections([current_section]).build, + "previous_sales" => FormFactory.new(year: 2022, type: "sales").with_sections([previous_section]).build, + "next_sales" => FormFactory.new(year: 2021, type: "sales").with_sections([next_section]).build, + "archived_sales" => FormFactory.new(year: 2020, type: "sales").with_sections([archived_section]).build, + } + described_class.instance.use_fake_forms!(fake_forms) + expect(result.map(&:id)).to eq %w[3 2 0 1] + end end describe "#ordered_lettings_questions_for_all_years" do @@ -322,7 +359,7 @@ RSpec.describe FormHandler do lettings_form = FormFactory.new(year: 2936, type: "lettings") .with_sections([section]) .build - described_class.instance.use_fake_forms!({ only_lettings: lettings_form }) + described_class.instance.use_fake_forms!({ "current_lettings" => lettings_form }) expect(result).to(satisfy { |result| result.all? { |element| element.is_a?(Form::Question) } }) end @@ -332,7 +369,7 @@ RSpec.describe FormHandler do lettings_form = FormFactory.new(year: 2936, type: "lettings") .with_sections([first_section, second_section]) .build - described_class.instance.use_fake_forms!({ only_lettings: lettings_form }) + described_class.instance.use_fake_forms!({ "current_lettings" => lettings_form }) expect(result.map(&:id)).to eq %w[1 2 3 4 5] end @@ -342,7 +379,7 @@ RSpec.describe FormHandler do lettings_form = FormFactory.new(year: 2945, type: "lettings") .with_sections([first_section, second_section]) .build - described_class.instance.use_fake_forms!({ only_lettings: lettings_form }) + described_class.instance.use_fake_forms!({ "current_lettings" => lettings_form }) expect(result.map(&:id)).to eq %w[1 2 3 4 5 6] end @@ -356,12 +393,49 @@ RSpec.describe FormHandler do .with_sections([new_section]) .build fake_forms = { - earlier_lettings: original_form, - newer_lettings: new_form, + "previous_lettings" => original_form, + "current_lettings" => new_form, } described_class.instance.use_fake_forms!(fake_forms) expect(result.map(&:id)).to eq %w[1 1a_deprecated 2 2a_new 3] end + + it "inserts questions from previous years that would start a section after new questions in the previous section" do + original_first_section = build(:section) + original_first_section.subsections = [build(:subsection, :with_questions, question_ids: %w[1 2], id: "1", section: original_first_section)] + new_first_section = build(:section) + new_first_section.subsections = [build(:subsection, :with_questions, question_ids: %w[1 2 extra], id: "1", section: new_first_section)] + original_second_section = build(:section) + original_second_section.subsections = [build(:subsection, :with_questions, question_ids: %w[3 4], id: "2")] + new_second_section = build(:section) + new_second_section.subsections = [build(:subsection, :with_questions, question_ids: %w[3_new 4], id: "2")] + + original_form = FormFactory.new(year: 2023, type: "lettings").with_sections([original_first_section, original_second_section]).build + new_form = FormFactory.new(year: 2024, type: "lettings").with_sections([new_first_section, new_second_section]).build + + fake_forms = { + "current_lettings" => new_form, + "previous_lettings" => original_form, + } + described_class.instance.use_fake_forms!(fake_forms) + expect(result.map(&:id)).to eq %w[1 2 extra 3 3_new 4] + end + + it "builds the ordering based on the current form" do + archived_section = build(:section, :with_questions, question_ids: %w[0 1 2 3]) + previous_section = build(:section, :with_questions, question_ids: %w[0 1 3 2]) + current_section = build(:section, :with_questions, question_ids: %w[3 2 0 1]) + next_section = build(:section, :with_questions, question_ids: %w[3 2 1 0]) + + fake_forms = { + "current_lettings" => FormFactory.new(year: 2023, type: "sales").with_sections([current_section]).build, + "previous_lettings" => FormFactory.new(year: 2022, type: "sales").with_sections([previous_section]).build, + "next_lettings" => FormFactory.new(year: 2021, type: "sales").with_sections([next_section]).build, + "archived_lettings" => FormFactory.new(year: 2020, type: "sales").with_sections([archived_section]).build, + } + described_class.instance.use_fake_forms!(fake_forms) + expect(result.map(&:id)).to eq %w[3 2 0 1] + end end # rubocop:enable RSpec/PredicateMatcher end diff --git a/spec/services/csv/lettings_log_csv_service_spec.rb b/spec/services/csv/lettings_log_csv_service_spec.rb index ac6d14f0f..659cadc7d 100644 --- a/spec/services/csv/lettings_log_csv_service_spec.rb +++ b/spec/services/csv/lettings_log_csv_service_spec.rb @@ -2,7 +2,7 @@ require "rails_helper" RSpec.describe Csv::LettingsLogCsvService do before do - Timecop.freeze(fixed_time) + Timecop.freeze(now) Singleton.__init__(FormHandler) FormHandler.instance.use_real_forms! log.irproduct = 1 @@ -17,13 +17,14 @@ RSpec.describe Csv::LettingsLogCsvService do let(:form_handler_mock) { instance_double(FormHandler) } let(:organisation) { create(:organisation) } let(:fixed_time) { Time.zone.local(2023, 11, 26) } + let(:now) { Time.zone.now } let(:log) do create( :lettings_log, :completed, startdate: fixed_time, created_at: fixed_time, - updated_at: fixed_time, + updated_at: now, mrcdate: fixed_time - 1.day, voiddate: fixed_time - 2.days, propcode: "ABCDEFG", @@ -162,14 +163,32 @@ RSpec.describe Csv::LettingsLogCsvService do expect(la_label_value).to eq "Barnet" end - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels.csv") - values_to_delete = %w[id vacdays] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "when the current form is 2024" do + let(:now) { Time.zone.local(2024, 4, 1) } + + it "exports the CSV with 2024 ordering and all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels_24.csv") + values_to_delete = %w[id vacdays] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current form is 2023" do + let(:now) { Time.zone.local(2023, 11, 26) } + + it "exports the CSV with 2023 ordering and all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_labels_23.csv") + values_to_delete = %w[id vacdays] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end context "when the log has a duplicate log reference" do @@ -212,14 +231,32 @@ RSpec.describe Csv::LettingsLogCsvService do expect(la_label_value).to eq "Barnet" end - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes.csv") - values_to_delete = %w[id vacdays] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "when the current form is 2024" do + let(:now) { Time.zone.local(2024, 4, 1) } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes_24.csv") + values_to_delete = %w[id vacdays] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current form is 2023" do + let(:now) { Time.zone.local(2023, 11, 26) } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_codes_23.csv") + values_to_delete = %w[id vacdays] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end context "when the log has a duplicate log reference" do @@ -242,31 +279,67 @@ RSpec.describe Csv::LettingsLogCsvService do expect(headers).not_to include(*%w[wrent wscharge wpschrge wsupchrg wtcharge]) end - context "and exporting with labels" do - let(:export_type) { "labels" } + context "and the current form is 2024" do + let(:now) { Time.zone.local(2024, 4, 1) } - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels.csv") - values_to_delete = %w[id] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "and exporting with labels" do + let(:export_type) { "labels" } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "and exporting values as codes" do + let(:export_type) { "codes" } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end end - context "and exporting values as codes" do - let(:export_type) { "codes" } + context "and the current form is 2023" do + let(:now) { Time.zone.local(2023, 11, 26) } - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes.csv") - values_to_delete = %w[id] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "and exporting with labels" do + let(:export_type) { "labels" } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_labels_23.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "and exporting values as codes" do + let(:export_type) { "codes" } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/lettings_log_csv_export_non_support_codes_23.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end end end diff --git a/spec/services/csv/sales_log_csv_service_spec.rb b/spec/services/csv/sales_log_csv_service_spec.rb index bbc7af0f2..79efaf920 100644 --- a/spec/services/csv/sales_log_csv_service_spec.rb +++ b/spec/services/csv/sales_log_csv_service_spec.rb @@ -4,6 +4,7 @@ RSpec.describe Csv::SalesLogCsvService do let(:form_handler_mock) { instance_double(FormHandler) } let(:organisation) { create(:organisation) } let(:fixed_time) { Time.zone.local(2023, 12, 8) } + let(:now) { Time.zone.now } let(:user) { create(:user, email: "billyboy@eyeKLAUD.com") } let(:log) do create( @@ -12,7 +13,7 @@ RSpec.describe Csv::SalesLogCsvService do created_by: user, saledate: fixed_time, created_at: fixed_time, - updated_at: fixed_time, + updated_at: now, owning_organisation: organisation, purchid: nil, hholdcount: 3, @@ -29,11 +30,15 @@ RSpec.describe Csv::SalesLogCsvService do let(:csv) { CSV.parse(service.prepare_csv(SalesLog.all)) } before do - allow(Time).to receive(:now).and_return(fixed_time) + Timecop.freeze(now) Singleton.__init__(FormHandler) log end + after do + Timecop.return + end + it "calls the form handler to get all questions in order when initialized" do allow(FormHandler).to receive(:instance).and_return(form_handler_mock) allow(form_handler_mock).to receive(:ordered_sales_questions_for_all_years).and_return([]) @@ -154,14 +159,32 @@ RSpec.describe Csv::SalesLogCsvService do expect(la_label_value).to eq "Barnet" end - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_labels.csv") - values_to_delete = %w[id] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "when the current form is 2024" do + let(:now) { Time.zone.local(2024, 5, 1) } + + it "exports the CSV with the 2024 ordering and all values correct" do + expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_labels_24.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current form is 2023" do + let(:now) { Time.zone.local(2024, 1, 1) } + + it "exports the CSV with the 2023 ordering and all values correct" do + expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_labels_23.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end context "when the log has a duplicate log reference" do @@ -214,14 +237,32 @@ RSpec.describe Csv::SalesLogCsvService do expect(la_label_value).to eq "Barnet" end - it "exports the CSV with all values correct" do - expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_codes.csv") - values_to_delete = %w[id] - values_to_delete.each do |attribute| - index = csv.first.index(attribute) - csv.second[index] = nil + context "when the current form is 2024" do + let(:now) { Time.zone.local(2024, 5, 1) } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_codes_24.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content + end + end + + context "when the current form is 2023" do + let(:now) { Time.zone.local(2024, 1, 1) } + + it "exports the CSV with all values correct" do + expected_content = CSV.read("spec/fixtures/files/sales_logs_csv_export_codes_23.csv") + values_to_delete = %w[id] + values_to_delete.each do |attribute| + index = csv.first.index(attribute) + csv.second[index] = nil + end + expect(csv).to eq expected_content end - expect(csv).to eq expected_content end context "when the log has a duplicate log reference" do From b68130c1d904513d7fafcec171183d92e258addf Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Fri, 9 Feb 2024 11:05:38 +0000 Subject: [PATCH 10/16] CLDC-3126: Remove unnecessary extra data protection validation from lettings bulk upload --- app/services/bulk_upload/lettings/year2024/row_parser.rb | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/services/bulk_upload/lettings/year2024/row_parser.rb b/app/services/bulk_upload/lettings/year2024/row_parser.rb index 5f05b6e10..28cfc1ca8 100644 --- a/app/services/bulk_upload/lettings/year2024/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2024/row_parser.rb @@ -377,8 +377,6 @@ class BulkUpload::Lettings::Year2024::RowParser validate :validate_created_by_exists, on: :after_log validate :validate_created_by_related, on: :after_log - validate :validate_declaration_acceptance, on: :after_log - validate :validate_nulls, on: :after_log validate :validate_uprn_exists_if_any_key_address_fields_are_blank, on: :after_log, unless: -> { supported_housing? } @@ -494,12 +492,6 @@ class BulkUpload::Lettings::Year2024::RowParser private - def validate_declaration_acceptance - unless field_15 == 1 - errors.add(:field_15, I18n.t("validations.declaration.missing"), category: :setup) - end - end - def validate_valid_radio_option log.attributes.each do |question_id, _v| question = log.form.get_question(question_id, log) From 3c539fcf83f649c9ad4ea0530baa0d0e19e52bcd Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Wed, 14 Feb 2024 11:30:16 +0000 Subject: [PATCH 11/16] CLDC-3155 Add accessible_register option and hint text for 24/25 (#2187) * feat: add accessible_register option and hint text for 2024 * feat: update tests * feat: update spec and schema * refactor: lint * feat: update row parser * feat: update tests * feat: update xml export * feat: update xml export * feat: revert xml export change * feat: update tests * feat: include schema update --- .../lettings/questions/letting_allocation.rb | 28 +++++-- .../lettings/year2024/row_parser.rb | 24 ++++-- app/services/csv/lettings_log_csv_service.rb | 2 +- ...dd_accessible_register_to_lettings_logs.rb | 5 ++ db/schema.rb | 1 + spec/factories/lettings_log.rb | 1 + .../lettings_log_csv_export_codes_24.csv | 4 +- .../lettings_log_csv_export_labels_24.csv | 4 +- ...gs_log_csv_export_non_support_codes_24.csv | 4 +- ...s_log_csv_export_non_support_labels_24.csv | 4 +- .../questions/letting_allocation_spec.rb | 74 +++++++++++++++++++ .../lettings/year2024/row_parser_spec.rb | 9 ++- .../csv/lettings_log_csv_service_spec.rb | 2 +- 13 files changed, 134 insertions(+), 28 deletions(-) create mode 100644 db/migrate/20240129161037_add_accessible_register_to_lettings_logs.rb create mode 100644 spec/models/form/lettings/questions/letting_allocation_spec.rb diff --git a/app/models/form/lettings/questions/letting_allocation.rb b/app/models/form/lettings/questions/letting_allocation.rb index 18c0a3042..09fd82121 100644 --- a/app/models/form/lettings/questions/letting_allocation.rb +++ b/app/models/form/lettings/questions/letting_allocation.rb @@ -7,15 +7,27 @@ class Form::Lettings::Questions::LettingAllocation < ::Form::Question @type = "checkbox" @check_answers_card_number = 0 @hint_text = "Select all that apply." - @answer_options = ANSWER_OPTIONS @question_number = 84 end - ANSWER_OPTIONS = { - "cbl" => { "value" => "Choice-based lettings (CBL)" }, - "cap" => { "value" => "Common Allocation Policy (CAP)" }, - "chr" => { "value" => "Common housing register (CHR)" }, - "divider" => { "value" => true }, - "letting_allocation_unknown" => { "value" => "None of these allocation systems" }, - }.freeze + def answer_options + if form.start_year_after_2024? + { + "cbl" => { "value" => "Choice-based lettings (CBL)", "hint" => "Where available vacant properties are advertised and applicants are able to bid for specific properties." }, + "cap" => { "value" => "Common Allocation Policy (CAP)", "hint" => "Where a common system agreed between a group of housing providers is used to determine applicant’s priority for housing." }, + "chr" => { "value" => "Common housing register (CHR)", "hint" => "Where a single waiting list is used by a group of housing providers to receive and process housing applications. Providers may use different approaches to determine priority." }, + "accessible_register" => { "value" => "Accessible housing register", "hint" => "Where the ‘access category’ or another descriptor of whether an available vacant property meets a range of access needs is displayed to applicants during the allocations process." }, + "divider" => { "value" => true }, + "letting_allocation_unknown" => { "value" => "None of these allocation systems" }, + }.freeze + else + { + "cbl" => { "value" => "Choice-based lettings (CBL)" }, + "cap" => { "value" => "Common Allocation Policy (CAP)" }, + "chr" => { "value" => "Common housing register (CHR)" }, + "divider" => { "value" => true }, + "letting_allocation_unknown" => { "value" => "None of these allocation systems" }, + }.freeze + end + end end diff --git a/app/services/bulk_upload/lettings/year2024/row_parser.rb b/app/services/bulk_upload/lettings/year2024/row_parser.rb index 28cfc1ca8..34823ee91 100644 --- a/app/services/bulk_upload/lettings/year2024/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2024/row_parser.rb @@ -651,10 +651,11 @@ private end def validate_lettings_allocation - if cbl.blank? && cap.blank? && chr.blank? + if cbl.blank? && cap.blank? && chr.blank? && accessible_register.blank? errors.add(:field_112, I18n.t("validations.not_answered", question: "was the letting made under the Choice-Based Lettings (CBL)?")) errors.add(:field_113, I18n.t("validations.not_answered", question: "was the letting made under the Common Allocation Policy (CAP)?")) errors.add(:field_114, I18n.t("validations.not_answered", question: "was the letting made under the Common Housing Register (CHR)?")) + errors.add(:field_115, I18n.t("validations.not_answered", question: "was the letting made under the Accessible Register?")) end end @@ -945,9 +946,10 @@ private rp_dontknow: %i[field_111], cbl: %i[field_112], - chr: %i[field_114], cap: %i[field_113], - letting_allocation: %i[field_112 field_113 field_114], + chr: %i[field_114], + accessible_register: %i[field_115], + letting_allocation: %i[field_112 field_113 field_114 field_115], referral: %i[field_116], @@ -1133,6 +1135,7 @@ private attributes["cbl"] = cbl attributes["chr"] = chr attributes["cap"] = cap + attributes["accessible_register"] = accessible_register attributes["letting_allocation_unknown"] = letting_allocation_unknown attributes["referral"] = field_116 @@ -1382,6 +1385,15 @@ private end end + def cap + case field_113 + when 2 + 0 + when 1 + 1 + end + end + def chr case field_114 when 2 @@ -1391,8 +1403,8 @@ private end end - def cap - case field_113 + def accessible_register + case field_115 when 2 0 when 1 @@ -1401,7 +1413,7 @@ private end def letting_allocation_unknown - [cbl, chr, cap].all?(0) ? 1 : 0 + [cbl, chr, cap, accessible_register].all?(0) ? 1 : 0 end def net_income_known diff --git a/app/services/csv/lettings_log_csv_service.rb b/app/services/csv/lettings_log_csv_service.rb index c853590b6..e9ebd875a 100644 --- a/app/services/csv/lettings_log_csv_service.rb +++ b/app/services/csv/lettings_log_csv_service.rb @@ -263,7 +263,7 @@ module Csv "renttype" => RENTTYPE_LABELS, }.freeze - CONVENTIONAL_YES_NO_ATTRIBUTES = %w[illness_type_1 illness_type_2 illness_type_3 illness_type_4 illness_type_5 illness_type_6 illness_type_7 illness_type_8 illness_type_9 illness_type_10 refused cbl cap chr letting_allocation_none housingneeds_a housingneeds_b housingneeds_c housingneeds_d housingneeds_e housingneeds_f housingneeds_g housingneeds_h has_benefits nocharge postcode_known].freeze + CONVENTIONAL_YES_NO_ATTRIBUTES = %w[illness_type_1 illness_type_2 illness_type_3 illness_type_4 illness_type_5 illness_type_6 illness_type_7 illness_type_8 illness_type_9 illness_type_10 refused cbl cap chr accessible_register letting_allocation_none housingneeds_a housingneeds_b housingneeds_c housingneeds_d housingneeds_e housingneeds_f housingneeds_g housingneeds_h has_benefits nocharge postcode_known].freeze YES_OR_BLANK_ATTRIBUTES = %w[declaration rp_homeless rp_insan_unsat rp_medwel rp_hardship rp_dontknow].freeze diff --git a/db/migrate/20240129161037_add_accessible_register_to_lettings_logs.rb b/db/migrate/20240129161037_add_accessible_register_to_lettings_logs.rb new file mode 100644 index 000000000..623a95306 --- /dev/null +++ b/db/migrate/20240129161037_add_accessible_register_to_lettings_logs.rb @@ -0,0 +1,5 @@ +class AddAccessibleRegisterToLettingsLogs < ActiveRecord::Migration[7.0] + def change + add_column :lettings_logs, :accessible_register, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index e6f2de905..658e82190 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -305,6 +305,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_30_084707) do t.integer "duplicate_set_id" t.integer "nationality_all" t.integer "nationality_all_group" + t.integer "accessible_register" t.index ["bulk_upload_id"], name: "index_lettings_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_lettings_logs_on_created_by_id" t.index ["location_id"], name: "index_lettings_logs_on_location_id" diff --git a/spec/factories/lettings_log.rb b/spec/factories/lettings_log.rb index f0493fc2d..23ba06bf1 100644 --- a/spec/factories/lettings_log.rb +++ b/spec/factories/lettings_log.rb @@ -112,6 +112,7 @@ FactoryBot.define do cbl { 0 } chr { 1 } cap { 0 } + accessible_register { 0 } reasonother { nil } housingneeds { 1 } housingneeds_type { 0 } diff --git a/spec/fixtures/files/lettings_log_csv_export_codes_24.csv b/spec/fixtures/files/lettings_log_csv_export_codes_24.csv index 82b91798f..832ceed45 100644 --- a/spec/fixtures/files/lettings_log_csv_export_codes_24.csv +++ b/spec/fixtures/files/lettings_log_csv_export_codes_24.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,,2,,0,0,268,1,,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,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,,,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,1,0,,,fake address,,London,,NW9 5LL,false,Barnet,E09000003,0,2,6,2,2,7,1,1,3,2023-11-24,,,1,2023-11-25,,3,1,4,,2,,4,,1,4,0,0,2,35,,F,0,2,13,,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,2,1,0,TN23 6LZ,1,false,Ashford,E07000105,1,0,1,0,0,0,0,0,1,0,,2,,0,0,268,1,,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_24.csv b/spec/fixtures/files/lettings_log_csv_export_labels_24.csv index 4ece610dd..0e345b837 100644 --- a/spec/fixtures/files/lettings_log_csv_export_labels_24.csv +++ b/spec/fixtures/files/lettings_log_csv_export_labels_24.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,letting_allocation_none,referral,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 -,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,old_id,old_form_id,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,postcode_known,uprn_known,uprn,uprn_confirmed,address_line1,address_line2,town_or_city,county,postcode_full,is_la_inferred,la_label,la,first_time_property_let_as_social_housing,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,pregnancy_value_check,refused,hhtype,totchild,totelder,totadult,age1,retirement_value_check,sex1,ethnic_group,ethnic,national,nationality_all,ecstat1,details_known_2,relat2,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,prevten,new_old,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,referral_value_check,net_income_known,incref,earnings,incfreq,net_income_value_check,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,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_sensitive,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 +,completed,,s.port@jeemayle.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,,,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,Yes,No,,,fake address,,London,,NW9 5LL,No,Barnet,E09000003,No,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,,Yes,4,0,0,2,35,,Female,White,Irish,Tenant prefers not to say,,Other,Yes,Partner,32,Male,Not seeking work,No,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Yes,Person 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,2,No,Yes,TN23 6LZ,Yes,No,Ashford,E07000105,Yes,,Yes,,,,No,No,Yes,No,,Tenant applied directly (no referral or nomination),,Yes,No,268,Weekly,,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_24.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv index c796f49d7..29c2db295 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_codes_24.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,4,1,35,F,0,2,13,,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,,2,,0,268,1,6,1,1,,0,2,,,,,200.0,50.0,40.0,35.0,325.0,,,,1,12.0,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,1,2023,DLUHC,DLUHC,1,7,0,2023-11-26,2,2,1,,2,HIJKLMN,ABCDEFG,1,0,,fake address,,London,,NW9 5LL,Barnet,2,6,2,2,7,1,1,3,2023-11-24,1,,1,2023-11-25,,3,1,4,,2,,4,1,35,F,0,2,13,,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,,2,,0,268,1,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_24.csv b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv index 572e034cc..cef9f5c72 100644 --- a/spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv +++ b/spec/fixtures/files/lettings_log_csv_export_non_support_labels_24.csv @@ -1,2 +1,2 @@ -id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,letting_allocation_none,referral,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 -,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,Universal Credit housing element,Yes,All,,No,Every 2 weeks,,,,,200.0,50.0,40.0,35.0,325.0,,,,Yes,12.0,,,,,,,,,,,,,,,,,,,, +id,status,duplicate_set_id,created_by,is_dpo,created_at,updated_by,updated_at,creation_method,collection_start_year,owning_organisation_name,managing_organisation_name,needstype,lettype,renewal,startdate,renttype,renttype_detail,irproduct,irproduct_other,lar,tenancycode,propcode,declaration,uprn_known,uprn,address_line1,address_line2,town_or_city,county,postcode_full,la_label,unitletas,rsnvac,newprop,offered,unittype_gn,builtype,wchair,beds,voiddate,vacdays,void_date_value_check,majorrepairs,mrcdate,major_repairs_date_value_check,joint,startertenancy,tenancy,tenancyother,tenancylength,sheltered,hhmemb,refused,age1,sex1,ethnic_group,ethnic,national,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,referral_value_check,incref,earnings,incfreq,hb,has_benefits,benefits,household_charge,nocharge,period,is_carehome,chcharge,wchchrg,carehome_charges_value_check,brent,scharge,pscharge,supcharg,tcharge,scharge_value_check,pscharge_value_check,supcharg_value_check,hbrentshortfall,tshortfall,scheme_code,scheme_service_name,scheme_sensitive,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 +,completed,,choreographer@owtluk.com,false,2023-11-26T00:00:00+00:00,,2024-04-01T00:00:00+01:00,single log,2023,DLUHC,DLUHC,General needs,Affordable rent general needs local authority,No,2023-11-26,Affordable Rent,Affordable Rent,Rent to Buy,,No,HIJKLMN,ABCDEFG,Yes,No,,fake address,,London,,NW9 5LL,Barnet,Affordable rent basis,Tenant abandoned property,No,2,House,Purpose built,Yes,3,2023-11-24,1,,Yes,2023-11-25,,Don’t know,Yes,Assured Shorthold Tenancy (AST) – Fixed term,,2,,4,Yes,35,Female,White,Irish,Tenant prefers not to say,,Other,Partner,32,Male,Not seeking work,Prefers not to say,Not known,Prefers not to say,Prefers not to say,Person 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,,Tenant applied directly (no referral or nomination),,No,268,Weekly,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/models/form/lettings/questions/letting_allocation_spec.rb b/spec/models/form/lettings/questions/letting_allocation_spec.rb new file mode 100644 index 000000000..ab268d840 --- /dev/null +++ b/spec/models/form/lettings/questions/letting_allocation_spec.rb @@ -0,0 +1,74 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Questions::LettingAllocation, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form) } + + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("letting_allocation") + end + + it "has the correct header" do + expect(question.header).to eq("How was this letting allocated?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Allocation system") + end + + it "has the correct type" do + expect(question.type).to eq("checkbox") + end + + it "is not marked as derived" do + expect(question.derived?).to be false + end + + context "with 2023/24 form" do + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "cbl" => { "value" => "Choice-based lettings (CBL)" }, + "cap" => { "value" => "Common Allocation Policy (CAP)" }, + "chr" => { "value" => "Common housing register (CHR)" }, + "divider" => { "value" => true }, + "letting_allocation_unknown" => { "value" => "None of these allocation systems" }, + }) + end + end + + context "with 2024/25 form" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "cbl" => { "value" => "Choice-based lettings (CBL)", "hint" => "Where available vacant properties are advertised and applicants are able to bid for specific properties." }, + "cap" => { "value" => "Common Allocation Policy (CAP)", "hint" => "Where a common system agreed between a group of housing providers is used to determine applicant’s priority for housing." }, + "chr" => { "value" => "Common housing register (CHR)", "hint" => "Where a single waiting list is used by a group of housing providers to receive and process housing applications. Providers may use different approaches to determine priority." }, + "accessible_register" => { "value" => "Accessible housing register", "hint" => "Where the ‘access category’ or another descriptor of whether an available vacant property meets a range of access needs is displayed to applicants during the allocations process." }, + "divider" => { "value" => true }, + "letting_allocation_unknown" => { "value" => "None of these allocation systems" }, + }) + end + end + + it "has the correct check_answers_card_number" do + expect(question.check_answers_card_number).to eq(0) + end +end diff --git a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb index 58be059fc..4501d25be 100644 --- a/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2024/row_parser_spec.rb @@ -1119,6 +1119,7 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do expect(parser.errors[:field_112]).to include("You must answer was the letting made under the Choice-Based Lettings (CBL)?") expect(parser.errors[:field_113]).to include("You must answer was the letting made under the Common Allocation Policy (CAP)?") expect(parser.errors[:field_114]).to include("You must answer was the letting made under the Common Housing Register (CHR)?") + expect(parser.errors[:field_115]).to include("You must answer was the letting made under the Accessible Register?") end end end @@ -1889,16 +1890,16 @@ RSpec.describe BulkUpload::Lettings::Year2024::RowParser do end describe "#letting_allocation_unknown" do - context "when field_112, 117, 118 are no ie 2" do - let(:attributes) { { bulk_upload:, field_112: 2, field_113: 2, field_114: 2 } } + context "when field_112, 113, 114, 115 are no ie 2" do + let(:attributes) { { bulk_upload:, field_112: 2, field_113: 2, field_114: 2, field_115: 2 } } it "sets value to 1" do expect(parser.log.letting_allocation_unknown).to be(1) end end - context "when any one of field_112, 117, 118 is yes ie 1" do - let(:attributes) { { bulk_upload:, field_112: 1 } } + context "when any one of field_112, 113, 114, 115 is yes ie 1" do + let(:attributes) { { bulk_upload:, field_115: 1 } } it "sets value to 0" do expect(parser.log.letting_allocation_unknown).to be(0) diff --git a/spec/services/csv/lettings_log_csv_service_spec.rb b/spec/services/csv/lettings_log_csv_service_spec.rb index 659cadc7d..7109d0e94 100644 --- a/spec/services/csv/lettings_log_csv_service_spec.rb +++ b/spec/services/csv/lettings_log_csv_service_spec.rb @@ -101,7 +101,7 @@ RSpec.describe Csv::LettingsLogCsvService do let(:questions) do [ build(:question, id: "condition_effects", type: "checkbox", answer_options: { "illness_type_1" => {}, "illness_type_2" => {}, "illness_type_3" => {} }), - build(:question, id: "letting_allocation", type: "checkbox", answer_options: { "cbl" => {}, "cap" => {}, "chr" => {} }), + build(:question, id: "letting_allocation", type: "checkbox", answer_options: { "cbl" => {}, "cap" => {}, "chr" => {}, "accessible_register" => {} }), ] end From 56425a8a1239c32a03e3bd4721aef4d463086498 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Wed, 14 Feb 2024 15:14:46 +0000 Subject: [PATCH 12/16] Allow incorporating links/styling into notification title (#2241) * Allow incorporating links/styling into * Keep links white --- app/frontend/styles/_unread-notification.scss | 4 ++++ app/views/notifications/_notification_banner.html.erb | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/frontend/styles/_unread-notification.scss b/app/frontend/styles/_unread-notification.scss index d76b36fa2..a42cd2d05 100644 --- a/app/frontend/styles/_unread-notification.scss +++ b/app/frontend/styles/_unread-notification.scss @@ -5,3 +5,7 @@ .app-unread-notification p { color: govuk-colour("white"); } + +.app-unread-notification a { + color: govuk-colour("white"); +} diff --git a/app/views/notifications/_notification_banner.html.erb b/app/views/notifications/_notification_banner.html.erb index 230fe458a..cd7dfffac 100644 --- a/app/views/notifications/_notification_banner.html.erb +++ b/app/views/notifications/_notification_banner.html.erb @@ -6,7 +6,7 @@ <% if notification_count > 1 && current_user.present? %>

Notification 1 of <%= notification_count %>

<% end %> -

<%= notification.title %>

+

<%= notification.title.html_safe %>

<% if notification.page_content.present? %>
<%= govuk_link_to notification.link_text, notifications_path, class: "govuk-link--inverse govuk-!-font-weight-bold" %> From d2c8c58c3e533814a5cb6254f63c3cc48c377ae7 Mon Sep 17 00:00:00 2001 From: Rachael Booth Date: Thu, 8 Feb 2024 18:05:21 +0000 Subject: [PATCH 13/16] CLDC-3168: Add Kent Reliance to mortgage lender options --- .../form/sales/questions/mortgage_lender.rb | 57 +--- .../sales/questions/mortgage_lender_spec.rb | 293 ++++++++++++------ 2 files changed, 217 insertions(+), 133 deletions(-) diff --git a/app/models/form/sales/questions/mortgage_lender.rb b/app/models/form/sales/questions/mortgage_lender.rb index e2f57306e..ee78ca639 100644 --- a/app/models/form/sales/questions/mortgage_lender.rb +++ b/app/models/form/sales/questions/mortgage_lender.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::MortgageLender < ::Form::Question @type = "select" @hint_text = "" @page = page - @answer_options = ANSWER_OPTIONS @bottom_guidance_partial = "mortgage_lender" @ownershipsch = ownershipsch @question_number = question_number @@ -54,54 +53,24 @@ class Form::Sales::Questions::MortgageLender < ::Form::Question "37" => "Virgin Money", "38" => "West Bromwich Building Society", "39" => "Yorkshire Building Society", + "41" => "Kent Reliance", "40" => "Other", "0" => "Don’t know", }.freeze + OPTIONS_INTRODUCED_2024 = %w[41].freeze + OPTIONS_NOT_DISPLAYED = %w[0].freeze + + def answer_options + if form.start_year_after_2024? + ANSWER_OPTIONS + else + ANSWER_OPTIONS.dup.reject { |k, _v| OPTIONS_INTRODUCED_2024.include?(k) } + end + end + def displayed_answer_options(_log, _user = nil) - { - "" => "Select an option", - "1" => "Atom Bank", - "2" => "Barclays Bank PLC", - "3" => "Bath Building Society", - "4" => "Buckinghamshire Building Society", - "5" => "Cambridge Building Society", - "6" => "Coventry Building Society", - "7" => "Cumberland Building Society", - "8" => "Darlington Building Society", - "9" => "Dudley Building Society", - "10" => "Ecology Building Society", - "11" => "Halifax", - "12" => "Hanley Economic Building Society", - "13" => "Hinckley and Rugby Building Society", - "14" => "Holmesdale Building Society", - "15" => "Ipswich Building Society", - "16" => "Leeds Building Society", - "17" => "Lloyds Bank", - "18" => "Mansfield Building Society", - "19" => "Market Harborough Building Society", - "20" => "Melton Mowbray Building Society", - "21" => "Nationwide Building Society", - "22" => "Natwest", - "23" => "Nedbank Private Wealth", - "24" => "Newbury Building Society", - "25" => "OneSavings Bank", - "26" => "Parity Trust", - "27" => "Penrith Building Society", - "28" => "Pepper Homeloans", - "29" => "Royal Bank of Scotland", - "30" => "Santander", - "31" => "Skipton Building Society", - "32" => "Teachers Building Society", - "33" => "The Co-operative Bank", - "34" => "Tipton & Coseley Building Society", - "35" => "TSB", - "36" => "Ulster Bank", - "37" => "Virgin Money", - "38" => "West Bromwich Building Society", - "39" => "Yorkshire Building Society", - "40" => "Other", - } + answer_options.reject { |k, _v| OPTIONS_NOT_DISPLAYED.include?(k) } end def question_number diff --git a/spec/models/form/sales/questions/mortgage_lender_spec.rb b/spec/models/form/sales/questions/mortgage_lender_spec.rb index 1fcf928a3..e50dafb2b 100644 --- a/spec/models/form/sales/questions/mortgage_lender_spec.rb +++ b/spec/models/form/sales/questions/mortgage_lender_spec.rb @@ -6,6 +6,14 @@ RSpec.describe Form::Sales::Questions::MortgageLender, type: :model do let(:question_id) { nil } let(:question_definition) { nil } let(:page) { instance_double(Form::Page) } + let(:subsection) { instance_double(Form::Subsection) } + let(:form) { instance_double(Form) } + + before do + allow(form).to receive(:start_year_after_2024?) + allow(page).to receive(:subsection).and_return(subsection) + allow(subsection).to receive(:form).and_return(form) + end it "has correct page" do expect(question.page).to eq(page) @@ -44,96 +52,203 @@ RSpec.describe Form::Sales::Questions::MortgageLender, type: :model do expect(question.top_guidance_partial).to be_nil end - it "has the correct answer_options" do - expect(question.answer_options).to eq({ - "" => "Select an option", - "0" => "Don’t know", - "1" => "Atom Bank", - "2" => "Barclays Bank PLC", - "3" => "Bath Building Society", - "4" => "Buckinghamshire Building Society", - "5" => "Cambridge Building Society", - "6" => "Coventry Building Society", - "7" => "Cumberland Building Society", - "8" => "Darlington Building Society", - "9" => "Dudley Building Society", - "10" => "Ecology Building Society", - "11" => "Halifax", - "12" => "Hanley Economic Building Society", - "13" => "Hinckley and Rugby Building Society", - "14" => "Holmesdale Building Society", - "15" => "Ipswich Building Society", - "16" => "Leeds Building Society", - "17" => "Lloyds Bank", - "18" => "Mansfield Building Society", - "19" => "Market Harborough Building Society", - "20" => "Melton Mowbray Building Society", - "21" => "Nationwide Building Society", - "22" => "Natwest", - "23" => "Nedbank Private Wealth", - "24" => "Newbury Building Society", - "25" => "OneSavings Bank", - "26" => "Parity Trust", - "27" => "Penrith Building Society", - "28" => "Pepper Homeloans", - "29" => "Royal Bank of Scotland", - "30" => "Santander", - "31" => "Skipton Building Society", - "32" => "Teachers Building Society", - "33" => "The Co-operative Bank", - "34" => "Tipton & Coseley Building Society", - "35" => "TSB", - "36" => "Ulster Bank", - "37" => "Virgin Money", - "38" => "West Bromwich Building Society", - "39" => "Yorkshire Building Society", - "40" => "Other", - }) + context "when form year is before 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(false) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "" => "Select an option", + "0" => "Don’t know", + "1" => "Atom Bank", + "2" => "Barclays Bank PLC", + "3" => "Bath Building Society", + "4" => "Buckinghamshire Building Society", + "5" => "Cambridge Building Society", + "6" => "Coventry Building Society", + "7" => "Cumberland Building Society", + "8" => "Darlington Building Society", + "9" => "Dudley Building Society", + "10" => "Ecology Building Society", + "11" => "Halifax", + "12" => "Hanley Economic Building Society", + "13" => "Hinckley and Rugby Building Society", + "14" => "Holmesdale Building Society", + "15" => "Ipswich Building Society", + "16" => "Leeds Building Society", + "17" => "Lloyds Bank", + "18" => "Mansfield Building Society", + "19" => "Market Harborough Building Society", + "20" => "Melton Mowbray Building Society", + "21" => "Nationwide Building Society", + "22" => "Natwest", + "23" => "Nedbank Private Wealth", + "24" => "Newbury Building Society", + "25" => "OneSavings Bank", + "26" => "Parity Trust", + "27" => "Penrith Building Society", + "28" => "Pepper Homeloans", + "29" => "Royal Bank of Scotland", + "30" => "Santander", + "31" => "Skipton Building Society", + "32" => "Teachers Building Society", + "33" => "The Co-operative Bank", + "34" => "Tipton & Coseley Building Society", + "35" => "TSB", + "36" => "Ulster Bank", + "37" => "Virgin Money", + "38" => "West Bromwich Building Society", + "39" => "Yorkshire Building Society", + "40" => "Other", + }) + end + + it "has the correct displayed_answer_options" do + expect(question.displayed_answer_options(nil, nil)).to eq({ + "" => "Select an option", + "1" => "Atom Bank", + "2" => "Barclays Bank PLC", + "3" => "Bath Building Society", + "4" => "Buckinghamshire Building Society", + "5" => "Cambridge Building Society", + "6" => "Coventry Building Society", + "7" => "Cumberland Building Society", + "8" => "Darlington Building Society", + "9" => "Dudley Building Society", + "10" => "Ecology Building Society", + "11" => "Halifax", + "12" => "Hanley Economic Building Society", + "13" => "Hinckley and Rugby Building Society", + "14" => "Holmesdale Building Society", + "15" => "Ipswich Building Society", + "16" => "Leeds Building Society", + "17" => "Lloyds Bank", + "18" => "Mansfield Building Society", + "19" => "Market Harborough Building Society", + "20" => "Melton Mowbray Building Society", + "21" => "Nationwide Building Society", + "22" => "Natwest", + "23" => "Nedbank Private Wealth", + "24" => "Newbury Building Society", + "25" => "OneSavings Bank", + "26" => "Parity Trust", + "27" => "Penrith Building Society", + "28" => "Pepper Homeloans", + "29" => "Royal Bank of Scotland", + "30" => "Santander", + "31" => "Skipton Building Society", + "32" => "Teachers Building Society", + "33" => "The Co-operative Bank", + "34" => "Tipton & Coseley Building Society", + "35" => "TSB", + "36" => "Ulster Bank", + "37" => "Virgin Money", + "38" => "West Bromwich Building Society", + "39" => "Yorkshire Building Society", + "40" => "Other", + }) + end end - it "has the correct displayed_answer_options" do - expect(question.displayed_answer_options(nil, nil)).to eq({ - "" => "Select an option", - "1" => "Atom Bank", - "2" => "Barclays Bank PLC", - "3" => "Bath Building Society", - "4" => "Buckinghamshire Building Society", - "5" => "Cambridge Building Society", - "6" => "Coventry Building Society", - "7" => "Cumberland Building Society", - "8" => "Darlington Building Society", - "9" => "Dudley Building Society", - "10" => "Ecology Building Society", - "11" => "Halifax", - "12" => "Hanley Economic Building Society", - "13" => "Hinckley and Rugby Building Society", - "14" => "Holmesdale Building Society", - "15" => "Ipswich Building Society", - "16" => "Leeds Building Society", - "17" => "Lloyds Bank", - "18" => "Mansfield Building Society", - "19" => "Market Harborough Building Society", - "20" => "Melton Mowbray Building Society", - "21" => "Nationwide Building Society", - "22" => "Natwest", - "23" => "Nedbank Private Wealth", - "24" => "Newbury Building Society", - "25" => "OneSavings Bank", - "26" => "Parity Trust", - "27" => "Penrith Building Society", - "28" => "Pepper Homeloans", - "29" => "Royal Bank of Scotland", - "30" => "Santander", - "31" => "Skipton Building Society", - "32" => "Teachers Building Society", - "33" => "The Co-operative Bank", - "34" => "Tipton & Coseley Building Society", - "35" => "TSB", - "36" => "Ulster Bank", - "37" => "Virgin Money", - "38" => "West Bromwich Building Society", - "39" => "Yorkshire Building Society", - "40" => "Other", - }) + context "when form year is >= 2024" do + before do + allow(form).to receive(:start_year_after_2024?).and_return(true) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "" => "Select an option", + "0" => "Don’t know", + "1" => "Atom Bank", + "2" => "Barclays Bank PLC", + "3" => "Bath Building Society", + "4" => "Buckinghamshire Building Society", + "5" => "Cambridge Building Society", + "6" => "Coventry Building Society", + "7" => "Cumberland Building Society", + "8" => "Darlington Building Society", + "9" => "Dudley Building Society", + "10" => "Ecology Building Society", + "11" => "Halifax", + "12" => "Hanley Economic Building Society", + "13" => "Hinckley and Rugby Building Society", + "14" => "Holmesdale Building Society", + "15" => "Ipswich Building Society", + "16" => "Leeds Building Society", + "17" => "Lloyds Bank", + "18" => "Mansfield Building Society", + "19" => "Market Harborough Building Society", + "20" => "Melton Mowbray Building Society", + "21" => "Nationwide Building Society", + "22" => "Natwest", + "23" => "Nedbank Private Wealth", + "24" => "Newbury Building Society", + "25" => "OneSavings Bank", + "26" => "Parity Trust", + "27" => "Penrith Building Society", + "28" => "Pepper Homeloans", + "29" => "Royal Bank of Scotland", + "30" => "Santander", + "31" => "Skipton Building Society", + "32" => "Teachers Building Society", + "33" => "The Co-operative Bank", + "34" => "Tipton & Coseley Building Society", + "35" => "TSB", + "36" => "Ulster Bank", + "37" => "Virgin Money", + "38" => "West Bromwich Building Society", + "39" => "Yorkshire Building Society", + "41" => "Kent Reliance", + "40" => "Other", + }) + end + + it "has the correct displayed_answer_options" do + expect(question.displayed_answer_options(nil, nil)).to eq({ + "" => "Select an option", + "1" => "Atom Bank", + "2" => "Barclays Bank PLC", + "3" => "Bath Building Society", + "4" => "Buckinghamshire Building Society", + "5" => "Cambridge Building Society", + "6" => "Coventry Building Society", + "7" => "Cumberland Building Society", + "8" => "Darlington Building Society", + "9" => "Dudley Building Society", + "10" => "Ecology Building Society", + "11" => "Halifax", + "12" => "Hanley Economic Building Society", + "13" => "Hinckley and Rugby Building Society", + "14" => "Holmesdale Building Society", + "15" => "Ipswich Building Society", + "16" => "Leeds Building Society", + "17" => "Lloyds Bank", + "18" => "Mansfield Building Society", + "19" => "Market Harborough Building Society", + "20" => "Melton Mowbray Building Society", + "21" => "Nationwide Building Society", + "22" => "Natwest", + "23" => "Nedbank Private Wealth", + "24" => "Newbury Building Society", + "25" => "OneSavings Bank", + "26" => "Parity Trust", + "27" => "Penrith Building Society", + "28" => "Pepper Homeloans", + "29" => "Royal Bank of Scotland", + "30" => "Santander", + "31" => "Skipton Building Society", + "32" => "Teachers Building Society", + "33" => "The Co-operative Bank", + "34" => "Tipton & Coseley Building Society", + "35" => "TSB", + "36" => "Ulster Bank", + "37" => "Virgin Money", + "38" => "West Bromwich Building Society", + "39" => "Yorkshire Building Society", + "41" => "Kent Reliance", + "40" => "Other", + }) + end end end From d6eb053fd9332f211bf92d964e1f5afa86d35d3e Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 15 Feb 2024 11:27:02 +0000 Subject: [PATCH 14/16] CLDC-3249 Clear invalidated earnings values (#2242) * Clear invalidated earnings values * Only run the earnings validation for 2023 onwards --- .../validations/financial_validations.rb | 2 +- lib/tasks/clear_invalidated_earnings.rake | 11 ++ .../tasks/clear_invalidated_earnings_spec.rb | 110 ++++++++++++++++++ .../validations/financial_validations_spec.rb | 21 ++++ 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 lib/tasks/clear_invalidated_earnings.rake create mode 100644 spec/lib/tasks/clear_invalidated_earnings_spec.rb diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index a1d799624..890c28284 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -24,7 +24,7 @@ module Validations::FinancialValidations end def validate_net_income(record) - if record.ecstat1 && record.hhmemb && record.weekly_net_income + if record.ecstat1 && record.hhmemb && record.weekly_net_income && record.startdate && record.form.start_date.year >= 2023 if record.weekly_net_income > record.applicable_income_range.hard_max frequency = record.form.get_question("incfreq", record).label_from_value(record.incfreq).downcase hard_max = format_as_currency(record.applicable_income_range.hard_max) diff --git a/lib/tasks/clear_invalidated_earnings.rake b/lib/tasks/clear_invalidated_earnings.rake new file mode 100644 index 000000000..74dbd1aca --- /dev/null +++ b/lib/tasks/clear_invalidated_earnings.rake @@ -0,0 +1,11 @@ +desc "Clear earnings for lettings logs that fail validation" +task clear_invalidated_earnings: :environment do + LettingsLog.filter_by_year(2023).find_each do |lettings_log| + lettings_log.validate_net_income(lettings_log) + if lettings_log.errors[:earnings].present? + lettings_log.earnings = nil + lettings_log.incfreq = nil + lettings_log.save!(validate: false) + end + end +end diff --git a/spec/lib/tasks/clear_invalidated_earnings_spec.rb b/spec/lib/tasks/clear_invalidated_earnings_spec.rb new file mode 100644 index 000000000..19e5d8f88 --- /dev/null +++ b/spec/lib/tasks/clear_invalidated_earnings_spec.rb @@ -0,0 +1,110 @@ +require "rails_helper" +require "rake" + +RSpec.describe "clear_invalidated_earnings" do + describe ":clear_invalidated_earnings", type: :task do + subject(:task) { Rake::Task["clear_invalidated_earnings"] } + + before do + Rake.application.rake_require("tasks/clear_invalidated_earnings") + Rake::Task.define_task(:environment) + task.reenable + FormHandler.instance.use_real_forms! + end + + context "when the rake task is run" do + context "and there are 2023 logs with invalid earnings" do + let(:user) { create(:user) } + let!(:lettings_log) { create(:lettings_log, :completed, created_by: user, voiddate: nil, mrcdate: nil) } + + before do + lettings_log.startdate = Time.zone.local(2023, 4, 4) + lettings_log.incfreq = 1 + lettings_log.earnings = 20 + lettings_log.hhmemb = 1 + lettings_log.ecstat1 = 1 + lettings_log.save!(validate: false) + end + + it "clears earnings" do + initial_updated_at = lettings_log.updated_at + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(20) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + + task.invoke + lettings_log.reload + + expect(lettings_log.incfreq).to eq(nil) + expect(lettings_log.earnings).to eq(nil) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + expect(lettings_log.updated_at).not_to eq(initial_updated_at) + end + end + + context "and there are valid 2023 logs" do + let(:user) { create(:user) } + let!(:lettings_log) { create(:lettings_log, :completed, created_by: user, voiddate: nil, mrcdate: nil) } + + before do + lettings_log.startdate = Time.zone.local(2023, 4, 4) + lettings_log.incfreq = 1 + lettings_log.earnings = 95 + lettings_log.hhmemb = 1 + lettings_log.ecstat1 = 1 + lettings_log.save! + end + + it "does not update the logs" do + initial_updated_at = lettings_log.updated_at + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(95) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + + task.invoke + lettings_log.reload + + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(95) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + expect(lettings_log.updated_at).to eq(initial_updated_at) + end + end + + context "and there are 2022 logs" do + let(:user) { create(:user) } + let!(:lettings_log) { create(:lettings_log, :completed, created_by: user, voiddate: nil, mrcdate: nil) } + + before do + lettings_log.startdate = Time.zone.local(2022, 4, 4) + lettings_log.incfreq = 1 + lettings_log.earnings = 20 + lettings_log.hhmemb = 1 + lettings_log.ecstat1 = 1 + lettings_log.save!(validate: false) + end + + it "does not update the logs" do + initial_updated_at = lettings_log.updated_at + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(20) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + + task.invoke + lettings_log.reload + + expect(lettings_log.incfreq).to eq(1) + expect(lettings_log.earnings).to eq(20) + expect(lettings_log.hhmemb).to eq(1) + expect(lettings_log.ecstat1).to eq(1) + expect(lettings_log.updated_at).to eq(initial_updated_at) + end + end + end + end +end diff --git a/spec/models/validations/financial_validations_spec.rb b/spec/models/validations/financial_validations_spec.rb index 1a6672e08..c68a3b7b2 100644 --- a/spec/models/validations/financial_validations_spec.rb +++ b/spec/models/validations/financial_validations_spec.rb @@ -188,6 +188,7 @@ RSpec.describe Validations::FinancialValidations do describe "net income validations" do it "validates that the net income is within the expected range for the household’s employment status" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 200 record.incfreq = 1 record.hhmemb = 1 @@ -198,6 +199,7 @@ RSpec.describe Validations::FinancialValidations do context "when the net income is higher than the hard max for their employment status" do it "adds an error" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 5000 record.incfreq = 1 record.hhmemb = 1 @@ -214,6 +216,7 @@ RSpec.describe Validations::FinancialValidations do context "when the net income is lower than the hard min for their employment status" do it "adds an error" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 50 record.incfreq = 1 record.hhmemb = 1 @@ -230,6 +233,7 @@ RSpec.describe Validations::FinancialValidations do context "when there is more than one household member" do it "allows income levels based on all working situations combined" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 5000 record.incfreq = 1 record.hhmemb = 4 @@ -242,6 +246,7 @@ RSpec.describe Validations::FinancialValidations do end it "uses the combined value in error messages" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 100 record.incfreq = 1 record.hhmemb = 3 @@ -254,6 +259,7 @@ RSpec.describe Validations::FinancialValidations do end it "adds errors to relevant fields for each tenant when income is too high" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 5000 record.incfreq = 1 record.hhmemb = 3 @@ -277,6 +283,7 @@ RSpec.describe Validations::FinancialValidations do end it "adds errors to relevant fields for each tenant when income is too low" do + record.startdate = Time.zone.local(2023, 5, 1) record.earnings = 50 record.incfreq = 1 record.hhmemb = 3 @@ -293,6 +300,20 @@ RSpec.describe Validations::FinancialValidations do expect(record.errors["ecstat#{n}"]).to be_empty end end + + context "when the net income is lower than the hard min for their employment status for 22/23 collection" do + it "does not add an error" do + record.startdate = Time.zone.local(2022, 5, 1) + record.earnings = 50 + record.incfreq = 1 + record.hhmemb = 1 + record.ecstat1 = 1 + financial_validator.validate_net_income(record) + expect(record.errors["earnings"]).to be_empty + expect(record.errors["ecstat1"]).to be_empty + expect(record.errors["hhmemb"]).to be_empty + end + end end end From 79ced8f7a2562587b533d6cb658a7023dbff6cd1 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 15 Feb 2024 12:55:48 +0000 Subject: [PATCH 15/16] Log updated records (#2245) --- lib/tasks/clear_invalidated_earnings.rake | 1 + spec/lib/tasks/clear_invalidated_earnings_spec.rb | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/tasks/clear_invalidated_earnings.rake b/lib/tasks/clear_invalidated_earnings.rake index 74dbd1aca..b474a675a 100644 --- a/lib/tasks/clear_invalidated_earnings.rake +++ b/lib/tasks/clear_invalidated_earnings.rake @@ -3,6 +3,7 @@ task clear_invalidated_earnings: :environment do LettingsLog.filter_by_year(2023).find_each do |lettings_log| lettings_log.validate_net_income(lettings_log) if lettings_log.errors[:earnings].present? + Rails.logger.info "Clearing earnings for lettings log #{lettings_log.id}, owning_organisation_id: #{lettings_log.owning_organisation_id}, managing_organisation_id: #{lettings_log.managing_organisation_id}, startdate: #{lettings_log.startdate.to_date}, tenancy reference: #{lettings_log.tenancycode}, property reference: #{lettings_log.propcode}, created_by: #{lettings_log.created_by.email}(#{lettings_log.created_by_id})" lettings_log.earnings = nil lettings_log.incfreq = nil lettings_log.save!(validate: false) diff --git a/spec/lib/tasks/clear_invalidated_earnings_spec.rb b/spec/lib/tasks/clear_invalidated_earnings_spec.rb index 19e5d8f88..b7cd617ff 100644 --- a/spec/lib/tasks/clear_invalidated_earnings_spec.rb +++ b/spec/lib/tasks/clear_invalidated_earnings_spec.rb @@ -15,7 +15,7 @@ RSpec.describe "clear_invalidated_earnings" do context "when the rake task is run" do context "and there are 2023 logs with invalid earnings" do let(:user) { create(:user) } - let!(:lettings_log) { create(:lettings_log, :completed, created_by: user, voiddate: nil, mrcdate: nil) } + let!(:lettings_log) { create(:lettings_log, :completed, created_by: user, voiddate: nil, mrcdate: nil, tenancycode: "123", propcode: "321") } before do lettings_log.startdate = Time.zone.local(2023, 4, 4) @@ -32,6 +32,7 @@ RSpec.describe "clear_invalidated_earnings" do expect(lettings_log.earnings).to eq(20) expect(lettings_log.hhmemb).to eq(1) expect(lettings_log.ecstat1).to eq(1) + expect(Rails.logger).to receive(:info).with("Clearing earnings for lettings log #{lettings_log.id}, owning_organisation_id: #{lettings_log.owning_organisation_id}, managing_organisation_id: #{lettings_log.managing_organisation_id}, startdate: 2023-04-04, tenancy reference: 123, property reference: 321, created_by: #{user.email}(#{user.id})") task.invoke lettings_log.reload From 98f20f32e19fec8a20ae8f407c4dc29d9f51b1c9 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Thu, 15 Feb 2024 13:05:04 +0000 Subject: [PATCH 16/16] Update sales paper form (#2246) --- public/files/2024_25_sales_paper_form.pdf | Bin 436888 -> 437255 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/files/2024_25_sales_paper_form.pdf b/public/files/2024_25_sales_paper_form.pdf index 4d06bc351504671b67b4c1156a9d1b561224a24c..9bf01d08be4f8e6eea06aecc7b9659a34616d38c 100644 GIT binary patch delta 120664 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 z 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

p5pj~qt@Be79~1_Hwdj3I(Fg10G?>DBZ zxu+5Z_ml;Vow~n5B@`4-*qm+_(wqbJ;9qVBCs9II@GG^j{kpbvk;DK-j04p^1ZJ!9 z&QDLSMg^7r*dCg7X$s!t;03plU@LvlRYmmK)SoJCP~x-XA51>s!crH*?9iN z0za_XUt8+YwlwOz&UU+Go@Y||EmNq!*lZZr^+j9KR&)3m)X5U z$A}KI4&wjUq(Ybf>Z@C@;{Kmz{`bt|*7|B-16-T*f3@|@wuUSQ{YThOa02c#b@#tr zCN~%dciH{N|Fmgiq;(jVO?z)G;64NCXw9*iUMJtGXLS4DRw*6sC82mj-~iyhG7g+i zwZc}UUV9C-_dzYl8q?UXFqf-RK(8oGwRRU?_kZOJjPS#(vD+X|sFk->{dHrVMEILl z(Y!VIS<>P!tz(w8#a;a+%#3Yq1B_%PpEr`~38rlOoFHf{3L0 zAptL4{&FkU#mAlex{$_gj5`=jU7JLJSWWXzj_ z#(t;bvP)FtGjch$aGePeao|@65d4ok@Yw-1wW+y^?r)R1_01V^;ASXDlvX!%DXpmv z0aygsk&Wh&&E^@c=8^5@k)5b;lt%FW;q&m!c~#rhsgQ%Vn^>@TgZ{k?8sl~v?nt}qKB6qr~@z@ig2kkf65%IqJqPf~)5Saa7rJ~CZurmJ2m=E@P`8GpB@r9e# zx3}M+$&~c;#rz zd=OR=Mzfu+HOg5IUs!@x>sJg|^w9lhiGrLG#a)(`;Ceak4ZoKPYf`EtMoNX)84|BV z*5WJ;n42dc1csq zQgx9_ z>@AklGpQMU4jVIw!KP;P|MV63W_IX~D(ASugSy0ny22y)FQWW#RlX9_FXZZYOU?0Z z`30*_hTuUI3vLsa*NKwnB;4!EXKDnIky`OD!B*w3Ru$QLDmjEJU8gHKlqos1)u9rU zZex5UiB-Ao*%CaC?QZD8`iM0M(aWGbZl^q6t2}Lv;Yqwg;@hWPfyKP zMLQ?(5LSbS&=fp`OA+1*cDUccEAw1NQX1_~lzx})Z8J+hpc(!&m78F1%?m({9{P%^B)0~~Gg^x`Nw z!V~6{tXp-db@k-f8_VDhh1r%U8|2L@NH9Oi&5smn{8ZuZw;xdW;E%;p0Fhr+^OdN- zPc5rXQ~e7%qq#tWoc6-TZ|N25YW{c$j;|_`6w|y3>%kc%Q!0mbBVxbStfuNfZWuy2tJd+H|!q zWoor;YPDlc4fI7L*ug~+0xZhZV#-#G)}OzTX79Sjt5uY#HI$;A6%P$r4+P%HSEfmfBvBU5!YBq;{i2xEW&v$Qg&AFtAB}Dps-CfiY3W|HI5z z{_KO#nBb@r$`mBEA3e;?m?A*VG^EtSL9sSL1IJpMM$(x^(wO$E6#fI3k@;nMyaggI zr5&#M@MunL=^ES{kS|yLL7pMiuVeUwqhD|r|M%Ltd_xnW<*Lz)Z2 zaR#GtyIl?L!hU!WrS%H((4WO6(m~_hM#9PIAJ9fqS-@eHy3$z&|F8^ZSUjdlE;yit{72Plsb@2Us1`9zzdz)=ed z2nUD$&0}}?V2qeG1{sg-!w89-Foi%WshV6V=)%JHlfQD`zEpCsrGDhY)HU;*j!h03 z%8a-jP5!w8r4|(E5z=6&6~h7hD=lOZ?~i`6Uy_lMZ8*1n05lvkp6i6(D#m*M6a;2V z-vBIDq_`&28Mpp}n*{wXy5Mp%))9r<>5Np$?I@r$~P@Y=PMh7 z?@eBurYxsD*1?;TEgL(B_=ll8Jr}sZX@15hZh!C3Y-GCa6ZYjm1wO63h8w(TT zDXV*uHSvH}Nkk*6Fw2{6wIO=RX{RtC|JT4BCApg7gF!Svp6O4>)y?%T@jb8VRcD0! z+QHG6ZFKD{$=G6Lg>d{Q zd~W$yYjRpGN2*!w>sOm1xOGl+aCmKD7} zY~fu#lto5s(lVOMu%X%@R!z>RNU0G`_w2oV-Q@j#*;NQwxp(zJN2c zAM%gVQH`teVcH;N0+PrZF>i5cP0L!S`y!>6>H&GjPrTJ_TIL(fVlfk-4J%L52rHof zfb&L)y3Pdlitcgl2e*brO=CJ+lDkSNTA#M__9tt%(|9#1s~OwUT*FJmsbZGjsMZ4e z?{E_}Qr~Yx*mnsz+;PuzJHRa0*kJbF*iz2-y0^mjLc4KFvf=;oz5OL$#t|HUlC~*@ z2%nsu<`@X|EE<;7d{^K-7}wo3t#}*keA#<&kBOB0IE33 z09!UYt>FRJw;@(r+px??{P;*I0HSHt*grm-bYNwg(`~%i_b#~#95nZjHCzoo> zBa2NhDcmcH9Qy~Oq~EwS~~9GYgNM-q5Z=3~P2 z=UL$Hi>?;DGnPy5PzLswKjv+5hwpe9dX?RAB}w;}NB8)wX?fqWcmJ+7S1abeylo{t z>#^fsS2}j@Ub{WbCY^7qC^Q@%T`bu~F^)g(?zl<*h32BcU$yaQyZ>h0XS{3`>e&~wHf}Pv$&;LM&_GljnZ#z%$nh zcz;v;oxs3Wt)KZE0N{{!#v2zs)_vB`K`jl9OI5B0dbUiYwWF|1SQuzAi069ioHbnH zi<_a)3bdKa4MLlc$M1sTW5);eN#%XTBbzStvv_nK&s+xA*`?H&g!{U`$d5TMV?RUD z8a6<|5{;z=ZQ?~8MlXj)|FULKAvwR6bxMO$1$eIuh*z&jfa}v^3+3MM9*`$WsGPC~o=_`6Y^R8~ zi-Ks9S9^>K2azfw^?l86259$*=|>4E)6gl{qd#X0Hx^Gy(<2)nZ}z=`s>o*Dw1yHd zbIBX;kAjQ)z*KU;`iI-rO-cjQDzY2r$dU6l^> z1N)A#A=6Qq+GPEX4tm&?J6M+W@F|Mi++P@9#)NXhu=?!dwxY*CSoPhj31wQLnba+TAM%GOe;CfOd;4&;V;T^Go9hK02s zmc?Ng0?DO>+XK5BwD?h0Cs1?m101|6#*q~<#8ZJQMsr|Bvhe??UJ zsEY@^bt|)4T4l1G(JCDDqY1ko6}Ou^iZ|$)#U+hw_l_?xpJ*CHRApl`isQ^Q4eVmv zxx+yFge7u}X>Dw8M?vO^NsQ`D!ArkyqsP`N0DH+|bUI!=t4PO%_4MJI68>KvC*e(H z$o4gKopUi%Rm1ml5be~}W=z2jN1~!9d}dm$Cdk;QSFvU4sr0jDU`b# zsM;$;CJp)IikNnd`Zotvfo4|}BDKh@>gIJP35v%-9Opc>iz~54S~}}3UOCTKgiX&U zKxRXT){6(mf#VHx<$Wv)QiAbIn(W{FtHINJFGaGjp+daZ>LfCB*k=Clbyo5|2e^_` zB;vOg*(8pZp9}6VD@SQKN$z^%-P+f6?%>%fR>h>{iHNDlj1@oUC=!b>v}-^P~F)W_8VXC zTUz)~OP`&=NULRULV8a4{es2Q&>H(=!!?QTaY{ANB+Y@HJ@FNoXR&Fxs{1s(arD50 z`&-rJn2jqeeS6 zbe0q2rHRY;fda(Rw6#H^mq|PP?*s$7UsofFu?1ZgfiEkG!BpY}^~7_D3^;;CbuY+b zL!RF@ViANyhv~?o5n+|A3ZFgk6?Ka4racnVCRsfYBm|#k8E%duLb64^0TWDV&J7xh zfCK#iLfo6&#_IARU4s|q*5(9VlYNyP37w4Lr3v-~W|<@JP7|K0pSxjxoN=nHKJ3^k z56+LP%Mn|;UQ9+DmfuHqL_AK#73eBkb-6AE6o4(hnx6XvG4^8nQ@s;7R+b%as>#E| z_#ah!0)RhmJ=*bJlIkZtLqe@${Onl^mWny-OFY{$H`H62!yT-Cm%YToII~PxgHc>lWuBMhR z*gm*E#__EXVZ}|D9?Z*NjzFK=IR!5fZA4ryB%KhBG&lo{fMy|i_FsWYDj(*PIERU! zLy|3?c73^QpQVys=~@&T#dPVQV{o&-sJ5ez{Mxv$z}sG)qswQ3NBocr?e- zBF~y%xsaei8M4avi^w2csAVG|DP#tu^)ed?o|lw#$vWcMr+wVgQ(6Ru$*sH9y2BmE zxyC9JAdQw|Lp5KtELBrl-XMvc%pVnxJg1_EG2lYCO9e!HwQ+Oy2#M^ZlvqHcJ;HL4UBt zcx9n8rpBLf=kg`Ujg_g#FILpyN6>T%kkH#FK>0fE(fanMvB$$mhwpl+Xb+dN2ChKq zLfeZTG=ot|w0KvV>^jW4RmirA-XA9F@**I&xcg^%ULqCx`)MBP0`5YWR+m2>mvbjbZjrS$BtvPoEgWkT~LCvJe_9M%l{=LdM)Z>oUkE8AF!9wcb-`zy4a#4*Wd<&7VtRN1heWs%=244Q z=i)x@_TdGh)okxth^SNh;U=^cYR21``XvDS%l4}cXvtfoV_0>dM|_|Mhi%1U@dTm` zuihkYKDmiNvx2zyFjrA0XZG&zoaspkt+6ic*nAJ_-y8Yh*F1MGcv9C=)yoq#U=QcS zEe|mtkISF#*R#_jn~wBlY6fN6nQO|;Lz6~r*na=S$&Mq+1Dzco-aN(yUT zG3kMoE}=zexeTCqcLwmsEb*2ledc?#A8ex=^Nvw)bh0WSu6m}Z*+24MBA|?umHJ$I z0jMG^XVNr1>DhG5ZFrppUY(`_pSJdYUKiaDon5lGbB4wDN%DDRd$w<@{x}uGx|;d-4Mtm-h^4`^DY;LR$ahI$6^SuPK>>^uUI;W zpSu}o3L3(WZoHIqMcL}LqJBa<*f|$f({VfPx;x&74N(hsoj=@kB|jqpq#W+IoqT2S z6dyyUIu+X*T!deRF->{TQ!gqNpXqc9?>c2p-?0u%I%H0PKg;i&_3uvR?^cC(E{O6k zR_!#K$8&EB#jn;)UVoO)d0W6Vz~g^7|GhwyK*7*$EPL701pQNxoy_UEVIJ?swj|?P z@$0vR??Bl1!r=SdNdfL+ial?$cW_zYG9Vq^f)$@ncfF!xuokw03h#7rn@zYPys=sc zz03hVCnN;kjAh`~qxODnU9_XI5q#rq$}yJvu?)CxEKk~n>K5#7zP=DNAg%sz+27Btnrs^zLN$OnR;B>>QF6$S@usY)$aT_FppLxZ)s~L2JTytvO;@%dUBo$e&{U&UhcgwtuZ8&3^1U-gI zrFuoHb5civmf5hos|~t@c5^9FAn$r6SLDn8JNJ^&wYV)F87xOuJfibSAK)!1kQ9qL zpg+-O7vw2@;~AW^4A*fk?kHHJnf6?4a=&f?r5#3=A5`z|$jUA|`uetQgg=KC$|n2` zGkvyIeg8dd^;E6V@*d;{NOsT_lFxJ#aWh>mF*z$ z$lI`tVRLDDyiIymml^ZCPrk`6+ocM(!Rla#kEX|#?=Uu!?;O4;rC;#O|9Bax%Aj;G z3Z}<2&n-@7d3V0qi2_4Ww*04Do%fo9Su`s#lO7l8M;P^Xl_&3FP_7$&rLFj=3sC17 zOYg9!FAtiHz8JcMzXJK1;sjntSfizEA=bom2^JAF`ldY`a?T$IB`~o|Scf*<+jEfG zAPS$lZqZLm5grIIw*u0J!zfJu*tX2P-jN5Su2vyV$B~c8iUH#ox%*t=d)oxsmkKFT zu%z0R=Z#hHI1w&4E|{>3XmFy_L0`k%htov~5(>(!w1{8#wV1DzIi+oTd+^XVpR z+&~An*M5+67#WaxO_KMtP0?~FasGmqj@UK&?9{w|(6ku#Oi9>aY^~K4BH8A7W7mo5?eP%C%N6%wDCgjN>+yDfY=t$l_iD+hw%yhuy7H)@fetFQQ&h0`Xk)hc+ z5gVx9W7J&mz#ajOk`-W0oa4Lxy~`+V$SLacF)@h?SX@U+LmW>Xw*ZW@bT&n21R$Hg#^G;H0y3V@OD^B#R){~+` z*pz8fF9>W$b@#IN1Lg8{KYPv0#s&S0dxy+6rA?{V{Vk=_)~!j{c4*UuyZKUB_a1lW z`sqSKCyb`r%hPq`%M%zThb!-A_N{I}+-FWV+ESJGjBO3MkL zvv&ne-{$!)vfEjz-$H(#xQngr9Yu5~9MOUG?~544?No?Nn_V?8PzjE9YD<{Tx-?62A3{r0}C@T>i1{FxnaLao4b?Qi#hoekt~`r>lU?E&|MRQK5= zr+Ll4yfRmePx3R%jZVq5vYX#kQ>m(K+m@Lgnk=X1Q>1K6C5fraZNu*{&mW0tm9y8N zR!rWro@|y)u>mb<_XqZQz2o^#7h=zNz~TjEf8$!4)CEm6;l1NtY=Ws<*s=mK;Lt1{ zJHpjd_wqq2!+vW8cVRLK4Hd?QUWR$s-O8!Vqh@k; zEv3eE(R$6j{LA*`^OUxQ(5rS!mDKa^b%tK2#UNu@>_b}G{&vyxv3MR3*P)5f#9o~X ztu_qvDHOI^akBlEcw3`mk8R8g@R7|yGrTzIv|aSOR6NfTEGp!lrMF+;OUp7wzi9e? zwD*}r2f{wae4u}2+rhav-C|u_PG>WT;;pLvndcnLqNI zDIendUgvw^`(4!g15)SPE%2WCeq#eXPQGuvdp{0tyg%M=1n%IpzNm8or;M*nNN@kRVB0@HLzqJVan-d42_#c zXBSS%Z7_I_=qsLYXhJFm5)+c+5>JTdi=2QCtdX36gpp4mAc0r;^66UHApsUB9cefE0P_g z*RR8O$L*D3=}zylTz#XQ-^gq0>>bUvo_E);Tkq)J^0<8*;bh?!qtoW8}m%mT3|p=nx&QS2H_QRA>kkwFWl1w^X4Y^aeM?6KzE(inrZg}&&tSV!>Y=i zfp~Lq?CC+~(SpByoKSpg9V)t^;(4QeS(_;A(AwGPc-gv+s0k1D7M9S#C{}Z$B7XU- zHJo9?LU!+tfASX8xYjR^=3d~!z-JFD8VX|Kc7Gn2b?ZX4k?bryTxyKsT8=rUiaoaO zigF=veCikh95u20>f;Qn1PP2$lQX)!Ua;c}C%My%Y$hb=Iv%IXt|6(5WsI+Jm-w!Z z5FJKU#73X-mtHw!M)O)I@m_Bzp9uF#f*yspl8ilQuAl!D{b@-pHa2ZsR1ifnULRP`+Ll4P9Un4A~^;!M%!xs@=T#mb?;Q8m=Jd)%{H z=9t4dCA8YHfLLIEJF#j%@DQe+j_}=Ym3imj5VvAA^}JoIf8qBXGvxO4_st4#kDfjw z&!th!H9pVMcV!8+19OX`y(Ye+Th4*GLA6@8N#}iNdrH_ddo6$j8w)>GI zsJ1LXDfdKn#Volzf~P&)ED#mPP}Sf|k|Gd3y%o9{PgiP- zl*gl)_^}Vp!@hOL!}E_fXV2j5bptBv+39a+TK6w$zIU z22hF|NpTg|=P0B%%j@4nq6tS_ljN_?pm%!|j>MEty z=*N;|qrPJIumCkhX!IP2NABD-h0*a;sUJ z(irUAxCvYr6F|6B@c}wAe&S9+gSs}GX-N2)6O6aj_-NxGyEj*Q$3qMpI|vqv9xZRr zd-cy%jpj`dy9keze6^Whn#nsC7S=m!GvnwCD8kx1Ib3#&z9anLOQa3zF_32U3mp+R1g& z@BvblrD#Ez1r2c*%6X<21E!w;v!#O+(zy&XRV+~b&u?T%+`u9UFjZ}khgxt(DN z{a-K>0^D1j>Q=18bTOOXhtx@}xe~r_81Q(|FwM1S?jH-#v<`g$8o^)D=Yuyg4B?tP zPSk;s-OK4xG!hv|+Tp7ybRq$t5UWSavpuC4@_S330i8)H_xqS^3FbEFI&0(k?o9!y z=&J)m{^2JI&4AWwUE)oBJ^ zV1t@nlAU&xZH|wv9Qy-GAAKhG|5o1To4DMXU7g$FHNy-}R%8I4XWs%V9s1}_@v4P6 z_KuLBIb~m#-L?}rC8He*C#pYx?05*hO5AtY5>OznOk)DVZPfY=7d=!vbm7LMGo$s5{HWn|%u}j}HbJ7jr2E^u zWG!tcwVp{KqFIuU0W=ja$xt;sk+*;S>?(@8iQ9pDaAvsK?eVQLP-4nZ>j#o(OlG4k zvhhvo-sOSRdzRf9$Cl%5eaO{GZdoCns?6{b#dnP(E|PT}tF2n}HXWFZ_I8a8P`ul5 z;?tc#N6TmST#=}#lGpNdGF`Kg1VQR{kCL?EpUbReCEA&Sg(bXQk*duWjJNIzJ9Jv? z55URKI9-d_@A06GHalML<|7w-kpA8Y5-oyM=hpSNJ;yKAykL+0hKC6?Zg!g{>lgX5 zLAyJR?>sLIGQO>z($&(9oO2Zw*gU*H3V&!>WkWsmjMDN6zTL!YL_G~hKU9?B3|E*& z^KR|WK6-DhexmkJqP1LqdelE(m`Hy>egTyC-^!Tanq|Zf6`yWy!y?G^q^q@@!_FH| zT$gMXxF7>xsWFl4#-MvY#jerVf4r8wUFzMkDz&RWp=snf{;rbQZMzaTuL}(cO!@oH zu9rq}ww?|jS2o%LMUA%gaWnRsZOxv!pasPyo5S47Lfg#tIVOl8$1)<%AzX)xVW_T$J?B7oFcb})LVSXMAp=+Hk2IENlu#lrgoU7rcXLIvCJ5G^ zn2)uOGL{Rpf^yE-$=KLr|A())4r=TB!o9I##i6)YN}r3H!<_u^JuirYboy9Oy% zT!IsvKyhzz*Wv_d1L5lZl zgY|`Qm%OD{47vg};xJ007}8XuM?Jj$ffLXFv#xa__DWD6Ej(RImY@fz;-qEqXMXJ{ zdYBO^a~68$BCk}zk_cI-xjVQ7j~O%U2Oe{zbAQFl5qw>mjtSxfBf81{kZ2^ue7sZV zc>(oD+wY$(MG;ZYsToB+E$)0{bS%89P`6UZ)2>oB)J9^QUlP5q#)geL5eEYr*8cq; zUV`{=6ulr|4;Hq0Yq|j4*ZD=-Ki2s}l%b|+tn)f?QX@_0@!j^K5B1s7`KcLevRf<+ zBh5{$J3C9P4Db$Psf~(P*>Z_I3aMW!2js?^?DGFE$+0(QA{|El7AH*#!N(v?3c_dk z2l!q{L8_qutH69)QlCA*)}EX#ke{@$x}C&AJ<{65w6nX!#BjFc%WRu=A{0k!;mr^t z|DQKQ^go2i=WhJ|efvr5Kcp4PuB|Zh5GxL~XZ*BymCBZJ>`-NJRr-?KS)%fP+g!3bUK+j^@YTco zb$PsK*P$>Ugfb7~!@!pc|7OrX(y7gu=nn3LC*5l7?Gz{?Q9Ex^mVneu`hfNyIEjYfkoGI{iP;@wygSe?u7(=I>Tht957?iLF%@D=(-f z+83DlL&l!ly9GzjPpXP@d$mJS_W0f{batn2R$IE*9#vAc1tmF=ve~J%vPXvRh!Nan zFaZVHAQV)EjUW^x1yaOJVO`53<`s0tnG|_p-cb4kmogE>4CyR%(zp=WajCh2D1&RD8q%KD*m*87;VExhkfNCdB zPj|ES);O&4WF^U?p-*6;>|>jnV6_|rux_hO$7`L)){5HH{j&g@$|?etMiDm&0qsW! z3eaO)N_eVF!K$T*1D3tUDS?l3{C2Mj0)Nx$K(Gyh(`5-oaByMbsnjyan7xQJlV|FO z*jFs_5d(BNXiD&tL)H|MxK+qN*(g|zgN>kp>j+cCQAc{U5v2TQ=zX}d<2E{ui)89Q@|pfTRtge_b??TV{QX-XKWmj7>ySxnhCnkc*1_B|2RzoBqR>EpXbO!X+tuOu}zS zADFqnl~7aAM;dpy8dY%<`t$a`CG?kK#H5J%;A+0#h=6z$p$8ykFQrj!5n^^H{l`f} z7KfDhA16I8o(`?_XE{qXMobpoF(v!Hpdq4oWwRk}A@TR50%1n(^Y+kobmTweuOnT= zmAoB5gm|Ekl9HnEjzFSq}(ebkqAUl#y5O zzX(PGz5jw4HS~gBDitG%8t*wPewCOnS`*nZB2Xp{Q<7}}F9uZaF_#)SE7bUEkDa(! zwaH|ecq|EInOy&Y$MPI2Q=(}94+;eq!G@-Zu!zyYt_*RADvcU{-2_VokvWQ^G>Ph$ zuXPR$SgE{3@wdv9JoSOygBt$FC^Vyg>#*{oL@B=#pPNh!}(rht(4);Rof6_leUVMX(zBBaDYCASwS&9{)46 zv3WwaAhC}{l*=9bR?QnJ)aLL0?JB!uyX^k9dsS<={}>w2V&xo<_hE3uHLr;n_unD;DW!P#qTlH(+p87q<($qa-T$#kf& z$cv>*vBH+K?JzXZdX zSgOaGg&Bnm?+cMoHCRnZ5hn-f57oV@QUy;%V#aDu@C7!yR|WXWJ0#rZi+2brGfL(? zU+Re##l|YeyX#O5uj4u$4HesaxfD?bBw3j#05V5_L6Ag;k3o=+XNiTuxP$=vBwdG_ zT4nCslx(LsEtIuFmqbdS*w92=yuC!ta01>`t6fCHlpaV_peIP8#b+UKeg9va0z>?J zGXAEj`b$HyEuVg<8=C|{qAEPo-ESSOjDNJ9+>D=T_bMproBU7gL z0A?(d>D|GK>O%;KzHy`piSDVLM{S5iGatuJ&EUavNI+``9uj}T<6=BKF0v%r_hogP zzhh7DhDSz1FS|0yS9aLiEEo~ibY}4Et1JssQC-0d1BH0f^o){N)f59IJ<9n*Tl~*B z9hncJ*bz)DM)QznbGsjQvigP5IqtxAD*E36vG(dOlubuXoeT?gM-(ua88cQm@6TTf z!edXP=%K`#+nB)xYNR9RvP|5Tn6lJn%=B1j6}htXZ9}u_RgDHk_Md-&^KDdhmp^pK zQS7LBioTgEf5qZrMI>YZwo3}Kr|@lq%R-8wt`!-GbvxI`E%X-hXA`weB38iG5`WRL zot&OU~RYK|bG`d3i4DzaDxGvHyCI`9oqi3;ZeY*M^y| z!=`kOn{)`OY{{cm#i^sV3cdq|_8Lyrjxq!_;8R5>oe+2~Dn`&lPayVRKOFEqmA}kH z2{Q0LW7TnoWgQSGS38*jIzyPuj};2(wYyiI5gPc%Ejk2PcH~h9Xiz(5rtVHeqEV?j zN+KmGX)v>8EyBY|K6UT`bHIEUJ%3r6nF~UMsGjMDT8_fYvmuO%u)o1Iz3Un+R5Z#RyCeLcx&uXr4Iv-OBMx>Gd6S_eLg zrVzXqueZ+csWzQcsUI*GBt6+vwR@%55DVndY=F0^Cze#K7x3@ZbB0AZgDGGH>jGesVb{jQ69n96zP?mzNpq4GVUZ~LNe~MH{XazcTT8QM9X1qa(B-2 zaRxf$8pZSo;@nY4g_l$n8gLi+pNR;{-Sy*o@b|@3Ht&9qs{E(>J(BW&-9;GOVMv;! z+)b_`d8|w7qiF>M!w56vB_O1D)@deIBVHq)*(W+VFaHmjVsHWf*J)C5 z_o=u|b4NeDAdcxer5Q3U808iwdE{SV99(9X4bI$ zsjYu`jqEGMisG;W4Pn->f@Ct*%)(?0_;YTtZ;zjXfb)nTq#db;4`L@YGs?ICBv@@{ z8%HKBS?^U5scMiO3-l276WMWq?)xvDo1GpxwF$h%23H95693f*#ofFJo$@bYPr9(B zX%N*GQKFd?qPf*GLe~KLFHKTasb(2{?$fEuglP$dd8J;O+J+LNC^HojrHf;y3L9NNqqHZP9h1^d zEJPU)$7+C4f{=OPtKJ?>Dnk{dv*$j%v6D0LMAw!YNc@PE`M;MA{oCW0EpdU5P^ieS z91Ur7%IG4dWLuDUQE`3&eeGw&#}u^h77`4IkKykZTKHCwlFAZzK}ab6yMQ5<-aXAy z;@?F`_>Eh6|31=uCQa@FU2(7$>6zDcSmCAMld9P{VTM@fFi%E{h1~gi!K7(DVFr8H zuzE(x$)fTj-#Ji5X#VPp8Hs+7c)$UVr8Hd_i&}mU9@eXY&Q8vQ0MjF7 zHyWlhsEb|n(m+zOuC>I0g9vq$uF+du-mi2a08;l{pej_|f8sNL)L-*^q1eG^HLJMt zd|TCy_yW`HCX{LRy(8C}r^-y=@HKI?3fvQ_y>t7??sdH9)4|h+`(vlyRiJ<#q#a=W zV@tM8!4{JYY2){$xyHC%YTkMb%)2#*h-Q&L<09Xrtpel(Q&+~2;}ZSGgA`CA`H_-H z@oW+Pi<4r&d2c2)(`_du^NpT}R_u>Of@!{vLZ|hY)Tdrl{t>~$I^Q%pYBh~<2Tb|V z1dK&2{879*IPl?6!s8)CvqNVB2JqCR7T&4x{R~mWKp6byfEsJl?Ts3{_YXGRE+%%A z$OAm4lxPF^rj&@*Tk6;zvl-UOx&hOXiRvfNbtif z$9KOfMvR^iK72bit5#p6WAw{#l%lsban`1Bt3M6IN2D{JQxme610-K#$`>ZQTcjuU zB&(|(jSL&X(O*O+&c`RLB_j?qRYxZdGgp^mABp@R&ED4NKnqjB#G9j7_-x*0bhMuxU7tzhUd^=c)eZeAp?YFs%|!hzktAD47M62Y>mif z72&?AQ>%}GNe45K1WZx|-N3_Aia+Tn&@n`dkfrsT)IH)o;jhA=9I55$@p{1ICTt1d zOyubxu_q1@9BQ-HWA1diPyJ@!sW9IZtfmoXe=p~U+q!@fu3#ETkCoJoCr|ocFr6A{ zs)!I zf{XbLFh~aGxqcb~#AY5WvNugd|Z#TBR zx+rA*$f`29V#?gQh)GU2YXCJ%75s!uSd;PzSpI>GHMsCcDpjhW9qz0w76NuyvR#QCrHZ7rA)i8Oz1O=oQLck?A0VyQ zy%lO8Xg8E^KnKqHkxa@Om7mPaYWtoMUuy~_O-3DYZEbId;B%XI{^T9wkb4$gWtL1K z7WF0TY=oSt76QjWyD6)1yCfk!SbgT5RFdG&i_NI7!MDW!{HB>`IiBnClk*P zTE^IK?mJ94z@GBaQ+@A{>*U9Se-JS-zY5ndWghR~m&2lUeC(Q>rLy6SCA+8Ga6OR$ zXXve#*>SDuaoAZoExAZKMi$D!a|qck0Ytf|z&vMhq|hGOJXiR}fTtPA`j;|EP#B*bLYVUAi4IC#uRbQtmNF0+z@ybE!CjogBa*83Ad!)( z7Dz|UmgbW+S7<^#g_{#UX5=r+AS>^NaU&4|b;o$wQi=jCREh9Y)khwQN!w5oLr2?$ zsubFppPA2HWT5FC1YBCApF9tn%G3lJWjwrQj2J@UtsoQZzR{*fK{fCpdH+SUj-9l^ zAnHmsS0L=4gz!&2*g{ugs71ki?GiX!Ru?=Mr~VB>pcs-?k(?o6si&zNbYWrbRLGUl z|N1i;Um*N*Al*I(Mzg=10ufv;1OL) zi=_{BDTFir*RHufw_Xzg(Ey5ld_wW9UUWjvh6R~K`i2FQ(*pN5_=HD}G+teoe4L4y zN;ZnKG^6(qi*oMIKX18xP*ZHUT@zxz(aeZoret^jVOEa+$$vF!y_J!4;q|VSLt>x6 zn=Wg=9tfzrBrP#z68INck-}J%O)>u$S=$advk>YCUN~jFzC+twevCd+S#xWR48bMU zMUFDdt|b>6$Bbq&?1|6-VPCD3%;vDsrLQUfpT>pr{8%76r@PdPsH^ODh zAj<>9y<(*=JK&OM##v6@|525x)ht&z4 zi`>Jto?8K@WOK%UW1A+j%)}?ZUcY(eCnUHFGOXoM64N;KRI|PGdM7y1$~|Lge)ZZR4+K!WEi;l-P&fD}cgL(v1cb`L&*25OdP zFdKFCnUBOArs8pDn8)zHuSDB4f!Zq7Iq;QhDvi~w$Be+PBdCen^%2V!#`PT1NATV- zm)G*vULM>^uZ-cRx}ffodMeWq?eAne6>>7nxmA2f*rr+3Xwzt9#E8fM zB-UGR%emtND+;9@ejI&a)kz%)~BbFR#-g4{pk(wf@lO`J9A zCU^R|Zic>U-i?kA7UPT{G=;i6r9;Ba^-IMo4WiDny=?JUuOo1X+86N3ZCA~ip&@YJk4r;qCUqsc>mGrLG+Oo|4p-Vw>E{4#WpsZyHtO% zrqTUpG(4{M3!N7=YS|zUk)Sy12Fr8qJE&h&QyCrgLJ%R)gM8f50b(^l9~;%JwTz0a2_U#D2{B?PNN5r%6iHAP)G>+V1@!j`d6hmi@l$?S`4;h0AP5Z98QG?- zAy?VfrjCKvdi~w9c~O-(qj@I6B=nNiBPW$LWSE1g@YCmE4&yn0LbtNxbL!0xAn!BjmSN4bvmGtcL?7e=a| z#lUzp=jS%V7$PI9fNm5OaV<&<~L^IN6KG6EP1u4ie^2RPnirSE==sN{ zk^WPt;QH2o|L{+%GP4&SK-+ZM20}b4s}j-;K1Qa)MUxvIV{`96j$i0&hO^TGIvPjs zy)hIa3uU$_WWDtG|6~yLf4~R;_;~ep8^`YJiLm=E^D==KaL*5g94D?QOlIzlc|m1k(x7M z#@YPxMvdG12b*6mxb~F613X_SBmN=Sde?q@*Ih>)C7FMLMUcWO90e zH0G5`Nt92O7`u4F;DOzE^2)z>!cFz0!UABdAUc;eSx>C*I&AkXw%-^v^>~AeS>FHF zxuA1vYX-U!zQ<3y5>joIY=6T#j2xC-cn`0eB7_;qF>857W}`A|(M6LIg-NN)F=K}Q zh*e9)$E<2WRgr)on<*Sfub{UKT_d~3mD!_*r5YD4&kh^7bo!Wgis-+oz`ARU4)zmD zlbYhGLYAq4_0^BlYK_F2IL|u)-NR_bqVQZf6)2JYjPb2YAK_JYFAEyK8Pz^CEkNT2Ee36e4QNRTV}!hAND#hRLL zpPe|;JRsX+O%K;oW$EMo4c$Nf&-ncZgPbbq6kZFLn%LY1=}sdxU~nTM2SlKjm|=nl zXOP$hOs*63Cu@7^q0#MDFH_>gi;5)vZ{?J>10z=NI#UHXh`vm@4q7~=oJLo=OKM!d zAZP9}1^hE)Ap}LtAh7~`d=e70U)|lT%p5VjzaMuRC9t<9G2R+OwECkZv*m4?=RE*;IBH=nJ! zcJ*bZ?;g!?4dTBTS~2dFFgOory{yYWy;%Hyf$BZI#9_P*9(^m#Z}2y-lxYFaY0-i1 z@h|bd`h{(~J^)(b`7#$~Sl{zGUVmYP<88CJ)!*#{FSB8x<+fkn>z=3o_%N+P1}`*R zg>*H-$|RiIg~}%V9(yl+ET9rJ=Miy`E*!6-6G(|6%UnydqsM@l+>W8ZEYoQm(4Q$6 zI{`WA+E`iBOgT)}CdJ=*BMM}s!@95MAd zwx^A^T)q~h>le{8`~6Kd#&tV|My^;W*Y?;bDvfE)zNc5I)3v?s3hG?m_Z>>+Y>;0A z42O9IZdC}7o~-4_RI69CGznky&@Ku|pMz*K`4mcx{T&pl8!k93n=?^oIRgD2ORvjb zE~vQI5gv@X-ksJrtUJ;5jib_ZJ-sUOSaIXz{PP#K9(Z5c9FmJ6L=k|cDt_rDM6yCG zONDx+1$-5VSQ$H;p$E{5vveA&4Obok$an|pRK#+6Ve=++wDa@wwj@}0P%`H9aZ^?D z2}Z+qz03gtik$(w&{msC4|JyzCdn>OpZ1qZ6q1yhoF~nT!Sz|muP~G6<-F$_XP}u3 z`t;N+`6Ma1lg;BH!R^?6D!D*;BB}McQ&n)_h$b-aL~_Bfw!Gl$P(a71Y!2W+&9c}} zlOeg=E~fK3TIJ*YCGN>{ujKQABc5Gk+nxDQUp*?^V&&9KK|sECs(1e;cY(vHr}Vj( zX8KI_X*+uPtoQS5pC0HD(WcGm(GP0>KaZ8xLeP*Uz~*$}^CokBZ&loU2tqzXqbI^E zpitt`SM5uB^l;!%CT#`=A~a9kmU-TDGB~Rw<%)gonh{nL7{#4S<8<=F@C~`LR4UchAYrVxVLx`%7c4_bi%{ zTtRG2kX>53rBchJwm*DKQ%R?RAoucseHv7q+Gks7-?q;+^~u%{>6DEgklgdqO@e4yCOh7(o3sAj zwq~glv6k@LVNYv0jC3TcxmfGUf{m9}a!r~RwmSCD05zX1Qn0Mnk`}SVa`0>tGJY`K z$v7GhisjO{z6x1<rIp1_~!ZvN=U%?x_rtrDTLM?fygotu5l2Mm)ml1^Zt zkLSlqlQkRT zCGna5khXUoF^>=Z?1O6%hb=d|GySiLctOfx8N_XPvj%#B#O!;>zf541b;$c`ZZ zCe`n9*LzwDPV1ZLim!oI@crPKTrqy?(_0$EA-S+4kqk64=k|PuU3X2~>oy1##IQA# zsz6HzH6-p~Txrzv;7Z*jRFqtM3Ls>{3^V;vVw#Wzux?j(|Jk*etQX41Z?z?S>H@5^ zy}<*sS`}0>57AfcsM=wTa+%MF4D%n`K0LSI>s_*$j@3g%PKy5=rWMYuX9Hq>LE_-m znbbV$cN!1=#N%>nSIG?txdC+93C7pWc>c>3SLge) z{7dtTOC^i@JGyc;Oq$u{wY!gWy+G+~z|gIu!^|Hd~b%60@0UG3k`6}TZNDS2Gc=1+C1V%&I8x_J=s>noDjk=aNy zhrm?lTt7(i1AL)B%Py$|%);k0-%5sF;UI*=^L-c1yw}iMgnL};m!7Otap2cdz(BRE zrcA(HO}oTPMdxJ86_;KKjz05!HXJY%la#cLG0^eCb~{f^TgDLsg@v&RNypNS_pn+e zHeFN7ySyfq8(RWB9m)UxK-|qiLS=z#dsunSf@xRa3BGioHPZ$HaNOQ!hqQ)ieC*%j zNb_IW-5;tkb0DP!+26V82znxa9juKv{KVG>& z@B4cpq0ydq%Cma`10Eb`2~Mr_x_hg0xVtJg1EWu)^Ase&5s}5u^R8;u6*HZ~(ZnvM zn?Q>Zj}p&`EU^D<>O)xe8>0_JT6VwZLv@52TKtCCM$xA4H5_x&W1mH?*TjEJ!`wld zu2jo<7N>6UH=}nQ5;;{S#i9fE*)?2!=ebpP=lzwv^AcnC`XF_Zo@LJ-eb|U!a)#JJ#-Qo_vOQ4YD{K>{exgWp&Ch_e+C$Lvdpb++pA*wxlxkXoi1 zmUTeh-fZ|xcs~hvot>W#OtYLc`}-3hZbQs zvmC(^Jy&7@{w`GaqZ$=EfmR7C|2427d$r>wVSe*!*TaH zXKL&iEuPi1ZP@En=YQ?=P>!L#9Bi@H5xPOYb%vJ9pPeHhl3!N1Fo4&!_4G`-rZYd* zXI6PHd=d!5)3=Hnum#SK*0~(^Kk@rjm+#jjd zHg4Hw+xlFYoRN%tjGMWs;cDh!^*A&z)_)4Q+L?V9RXU3Dl@=oIYRrzEjl=O1`>&m=rgxWX=Y? z?V)*M+d?zBvM`6eANCA5oiSMltv>XC9Z4ptozq?#3pLhOk}FxZN*yKj zS}fT!X3%aKxBd<|>>1H7Cn%`^V~b8*2PYv$T}|SiJbE34%`uzByo&8U4gU9MY5Tk? z--%BfGg3nOsgPbSC7ncFo}Si$hhE9Y zN8E zU3<2%*b^LpMg#j&12~I%FOe>K{4FG<&&J6Wl)I*UWFB}gYy92Di}I0nKrDGV?15|3 zZRCDykkWYB81G)}$?O5swblRo!JCYMC#$44Q#@h;Qgrd2~$q`4%q_)nC8o!kD(fv#N${%&@9g(w~ z#WP{7>7|BJD*$p39+8zfNG`71d^KjbApxzl>58yDj~x|%L(@`jQ|s(1=)hvh1L^A* zX}jd6W_4wZR`aA3bZraGLcCICtSJ`*~wC2dt#00S=$Lzq#((r{-x4Y}u>5t=8 z$WppD8PvaSb=qq`aE*+UgeE4XlFjg9XI($8*hY5%AekVlt~Q0957RvuR!rUw*%N~7 zt0da{&8$?OktZN3(DCYHP8Oz&9eepbCvn42U=Zobej{>8LD*DTm}0ke zvHBW#dHVb2U4X@oAp5#w>-~S>YFE3DN@EIc?JbOsqlWl^09lmltV=dz$6Pv3*KFpS zh{EE-&WM)eHRM~2FR-KY6Y?1S45>5C`;YBG0BkwsO!0b+a}H#<`e<@85TX=rt5^(k zYIWP5-n=`X1w{32KPXq+u&>|Uo(~l6RaO99{+-S+>2l{SP#TqOp3$=JP{ZTaLFGGQ zR`L>}uX<~PH+DGs-Nq4~tU>m<{*RqPr!|=lOG`0}=WgqHV;E~m z9iRA04#@IVE19XL!CD-nZ~7!_^4;T`-g@24_LuUprm%4#<42hwnrG}`SeNDsSio3(!s9EnTc!4qmozB%TIadgHPuNv}rJF zuz<-~behR2EtTKm*Ee@F6L&eNEUUmFiZQLn^ERFHJQ&${4HFfdi6#M`L_!>LH1q#<0plyY8Li_*%wkkuKBCi(O*FfsSpjx|;2Sv&Xc*k+wk_sYT_g9!#sCyTLFSj?7JY+kMzCmThxfvB%%Sie> z8b$8<=p@i9;kJC+u&g-QZw^=shKu~^BD**g+&VboecC+eoYTbXa>IpPIhZbc3}W}- zR>peqs5U-yLS_~HO*(F#VAXqBzgM7D&ya|KSlHS+YZyih+3$<#scF%v8puZ|RYCxx zXf=mYps!f&;K;$mU$0}bya}7rcnwvo)k{WW_iBhx`NaO{8#J}~;S1i&YLWyak@^i;E9431QGt#? z!@eh+n3gt#HdRBmr|tOry}72JPB8Y%4|f;W5sYtdEUI@tw+>R+zZ>tERrd1WDDBZ9 z?)`F=(mpYTgKx=)+7Gz1WeW|D&is97>JPDW@;F@3Ntw9w_j-4yD<3ZqTX!_U$(l4T zjWhdI_hM$R^t)~U4x6Xw#D`Pny-tx=MgEn+-5hP37q$cEOFh=kaivw9Tmef{dElP9 z@Q~WWc9WJ%5~rS9&%bpMc>$YUH~=it%b~}^m}0Csbkvb>rWDxgo~*e>v1U~_l+?O=)K1g23I;WMd_L)>X zQ>rLM+528!0&n^zsi%FPDZ8!eJT!CK+y2_ECzunY3G32a6P*0K9;DCELR)7Di-SS~ z87t75zKf;O@XdEEC7sQAO{X6QxKzXJ*V#@Do_<{iaFQ?C>C`Lo#$R^1PPELDJhjnR z+V0L(Lo43@eK3*!<4_6Jm?|A#f_|IXF;0bklCCrn23|xoNhp>mK5rd1Cspp{pk4bI zf(Sr(OTMatCUqDmx*hi(MfPbpZ3Heg4(oWi0a$X@%!^Jr=3^{4?HeMlUzaGcPpASrDL^Q-f9Vs(kHT@%3m?_c`c;W^-5@*v4*SYL9D{)$zWkO@9U z)4ISXBO|h}M0X!y`!{nstDGMXFV&VYcVc_iL%2-pnqc!Cm$g(B`myCHuTtv|ML#Tm z@WWwKq?Vj1XQC5t(M!2#whOv4yG<8i2h7KEeDd@npc%8gz_P}!>~ z?YHX6mVMoywIxBn*wuQ!E0NlHlB>8F;aytpy5VYfQ>Zk|u;=7aGI5ZmJ?HgVQ8)f( zc-Cg`q{!@HFh>1*b*0XuA?$f1#k;c}ltd0#;$iJ8p;1bWKjxiLkSh=Q77Xc>EGB{NwpuYsg5nnoFjf~!V z1t=G#**KXU+qUP4@rXCy7Z=8`G(JI#{TIWI4TZ0L+aXOtxQr-WE}#a-(&?(E(H&SG zhkUDn`Rx1wbIrVZF0n?=8&UtJF1IQ&!|27Txzg_>K6%;}--$!M6R!mTZOXTomfdz# zp9!6Ln#%7+onPSjg?;8xo@LlcQr= zMsn4I8uma&?xB z_M?KOd*Vwv;d>Y7_=RCW^7<7=!}6}p#>A;7cQbhyh^sftMCR;RfOfjsCS zzjsY+Fc(<~vMy1!Z-X_4whW>$oBa>AtBx+pZ?~4<^Wm0(hwA_{fx&?C=;vi|*Jqum z!}|c$2F?0q*Fw$MY>fIh_V=<__5~fQ4)Dgaqk7|fIu|Q`_bi~@MGZ3drICuS;j8Z= zMw@aIesO)GgJ%rDI#GjS3UTg@9C<2S%B zLR{hK^lo z4{CVk*=PVLg|!dggy~QtjjA}=_;j>{pWU9M%nKB=5+W%853V7tjaX(&+s-eEuf z#Vk9l8dCB}=$)2PeM$%_uFmPM^F5~|w{ zY&pn^Tdc%j45t{p#rX6*qL>M1pwH;kQ{XDc0^9d>Bih5LI3?A*Pv18MBCLG-Cl5aX zZ%tB+HEmkh;A^qWg%d9vZS%bR;PsCE`JPtt$4dM7T+*Ptgp>%urkvj1JrPJ@rz%T9 zcrlpi)wAf_z*B+HA$Yz$@JQHcP!#gtACE84W4|-!<*fzG!>`L*YYW@1l*)B5+Hd-| zzb@9|2tf8(%Z_}rO;8t==_b{9Cm$8y;_e|qatjp(0^Jz8qMx#{-5uTLYty^6Pt;Xb{zPL>gAfSCy#Y?GgbaKR2})Q*kukM|cXX zDNFXlwN9VrCYeg?I2()pxf6@f+{d0{W{BVS5dVDdL9NTn>zYNWPFKVt24UbpVz9K) zzxrtwkWCiY^bt)2d(J>*q*IvxJ0YoghLj1^rwLH2VRTzAa7j4 z$(lEFo8=epS-sGxh}TS0O^m(yX5X;dmld9cexFDg^M;E%Q1Oap`EJdkZNi@Ro@p3hL z9W{L(b=FaU46~SECV^rm?4t8xWvFF}bI{2~I~Rr>%>9 zFIMuj{A;B=k`l3eSoC!pQ9~({GgtGNj%3mMFrNPOq-PWBloH@~v7(yp@K9IcXTJJm z%JbrbrJ3o6N}LU1Phx9LpE0|6o6D~PG%zJ#O_@$nrdj*C)s9SbX#96ql%w^XVUW(9VVH(E|1;PBaZ8z zAJ_DpS$HC5$@eB_GAHXw6eQhq?y{2S$-L@H?$NY9*|j@u9R_&i>B+OKk;C-6n6GO* z;>wNMzmFX@^*DbHeioCM&XJrv@$-!dQarX>-m$RogE}7G2AZe>%QI)pbv$|YGiOy)+(=hssx3D_B))kyzqcj?( zQKH%6@Pw`%7WVkHO@43j!d-X&b8dBoR(r-3VNM>P^WSLWlOSEo4hQ+EOY8x4$ED&%HQEgvxZBfX4gNBXI6hS^=iafmFt&Dt|-))6CC>aW6vnu-js6<8bgY^ z?*9BM&aSe|$&|g<@~=Nb`(+$r-ll>HY`IING~S&8@`ohhvI*+XKBRB&bo~s<3oM#! ze$51|&#qpBirVvhGENJ1pjD~@%-_BPW3x5X;kianyh4N;5AV-^SDNrNAw0|01ZwY; z*KctdKDi0Rd^U1?SedO!o<1MG4|e3O?B1*hBvUJEiybG9yrrxBm0XT0YZeTk5|zCxzPW8hY6< zFJBj#tPVYT(V)HX=yP`PO>d8o*SN2p^QWqJ)}!YAba~H5-#WgjYF->0zHy=0qEx^u z0ckt@%8xt$>J3(Y6sQSaZxa;%F(HEiOl5+!T&93k3S(NWA{PX@Rw%+bpKIS;&n59SMy6W!VrZc7I z^NkDr&L!7KzrQWW8*P=HI9q+mnP(AL-`VN?>l-u0`W^d#TOW#!!fh`x?=6&t7j0Dx zMD<-KICxnX?yx?M#C;}2UjMOz`u#=U;em>y3-!Fm!Ec6d>5X@mRSd}T7<{M+28BrFZK}&xh}Ze|VPs=aWruJ@iZMa?l+HT$+o+8)csa`R?$p znctt^J?kp0tMI|{Ro-LT zY0auy^+@4uvt6dR^ok9?>_ac=m6SVVy%!F3Ot|Qgwn%{+^6SD)HE}k6k$?Js{+NP; zZ;Siq1$!7)5t8lJ-#O7ZwKolxS;SpS4{kqYT;sd8F-f?g@^$Drjx4hc5IOq`(04x4 zw7%p%|4BQhTwU>K-`0|QpNjlz&g&7}Ud(wK)u>C#W&8Y@$b$)d-RVAeB@$nkUj`@@ z;CL#7u4T}+Hr#wz=u=DiY7Bp)Jl2zJ5lm`>np9J5a!65a$E8D&d7|5`niDHUq0nV@=HHk z_;B~T4`GGVoKRNX200C7BW5;GyNPf2Fz_4DukpO~04ZmLqbF9~!4IQQnf714ZsQ?mi|6=I1%fbrxN0r5dh;#iz zug_jabgx&+K3V>G^Fvqpk5-rhA%8jPa(EVeh?l*>fw&Iq5>n7)N-#qw7 z-(W?hhU?C?$$tQyX^&q&L@dMh?SFkc*M1~%34-C)<}1fPciyr*&Us_x=O+9kxBW2b zLgQkDvf+1T>d^U@8u|9d$FsMKf84#n(5~pDa!2f2@$BuSj-9*U^*@Gl!Gv-}3!AsP z4<=;Aj%?F}=ffl7z_z}dE1mNf5YObXkmp8{&F3#K&tl$*7oG>p+b*o~p0UhMHEsrr zU*>Uk;u`xPz0LS~S`%7c+}wN4=O0I;tsZw0MLedmnNGKScNnpC*Z+DGOW>`;?GP)z z@3JL1oge3YZp_Ng*4z0wvAQihh+yvBXR!MXFVt?>WXUhvyudpv(iX1Oh zE&d8OlB-17m1w>=2&?0A6seb`FS%0_IrjVW+?{G%XHMK)UshUS$foh?Kc6}u_IGFVzI&WgUHpja7OQ$N8H-V&xixRe77@HJe_XBD`M}}vmqDo?TD5ek zM{V7gUb79?kK~&AmOW=bqQ!XYeHJx*&nq52^T{j5CFVV_$m0nt;rM=*BEMSn`;vWs zgGCsZfICAkpSdXg?YIej8Cm`_Q`LCVQeE8FoUI4li`ag>zigpjS3eix#~vrN_qgo% z0=aH&hriRyP(5#4>m1Uhe)KU_;t`!_BQx1gVwQm$BD;1EMv^z==D>%qPZ2*qnqRMA zRf*L7@z?d%J26|^x9@XTe>~grb+BT7fc!lEq@^5pde3q}B^duy3|_q8zj>kHzD7cT3xk-at}8}Es}Y18`SX@9lT%iHQcd@}6NTA=|g-|J>WL`(bW+%@}|9JGa9r5Ig~l-Jl*W_!xNEo_+IzdV#&$9Ns3Fxjzh$XN^r z^Tp4APuE@|ZQ>SPvgG+Pru^Zv zquOa|qn#c2dkX8*1`?x>r((!I#^KNW=398zRyf87?O>ZB(T{Z?k0NXFf89Ywm?(pWnkif7TxM z^EE3ZO8=9q=i;S&$m36*;7TSmbVV`j<$T%e@ZkxozQ~-ugJAA2!L7=w-P|vg|IT(t zUViIc>ASbm{&j15xV@u(a69k~9l*yOZqWXfn=-Nf_pk={WqqFaL3DbzrL14CyPLk_ z8!Ff27j%!kI||z?xbBBPJ$;l3B4JXbx~X1UZ1!@A;4CiN(RUu``#rMByQ+KP(?zcJ zHA<}yGh)2^RNHbZX@IP;*BDj3{8A_`nG}}!r|Z!gh=dL2k*r(ZZeHi5|86vF7o_*k z<-;J$Hu8sBl0%#CRR63;X{Of07jCJtk!2{S5C>)w|g0VIEfh?{>sAFKm0XUy`~$?kQuzHXSC>YYCk-5 zSS-IzzqP7|lVwYw-i*q%w_n7jEZCD$YV+9-Go+07CnB$e%TR0%Ulsf0{yI1sS2QKl zQ+iM=+`BjIn5tQh-3ecONXd7c(g4eU$+fPEU3IQsH0luEbhACO~Cnq`2e7J|n4$UJzlA@I_wXO=~aq!O<;s1$$xtL2_NT( zGMr*K{1dGciGoTBqMgfwq|GiS`e7!PU+9tB_YZc8WD0#}x0mmUsM$T*q>h?FB6Ske zC%Gv!?nZFQxhpi0yS9=ejU*7n$TWLRa&4}GL>y@fW+0=IYkIYUG)D+?(S#A$zO#A43 z!bqa=Lqo#O+sEktEfoUjYVh2Fb6RFF`HNDFN%?aD{pLbL_dFwYXd6Kyc-J36LeWad z7_%K8W!@qESBRsizdxVs_T-7$vh>|ht9KvD?qqDoKxRz5nNtxl2DZAqy0z+I;1}`Q zw>8wC;ZS@QkEc-7G!x?vU)Hr{B*qeg966_nQXNCe+_M={4W`DS0HBZ@HC&G)Wjk>T z$7)%(e>%dpYE)Q1>>srrc?rWEbH2+5REW#IfyUc^;q-S?FwRU8;OS$_Hy2+PU%ODzCL$v{OC^%-IwwFa*zvTgE_=WGiudv%cW zVwNcOB@;Q9@CFO|>6FC*Spz9)D(%~71hX6w-TqVJ-(+VXgQ(n9E3@};=zmZrYGCLZ zMWB%rl20SGqLo=+YtOw`o8QO`p~25+hS0hK4Ss*KST0oUxqlUT6@{E^L~m6dPKZNi zR+cYG9kD}H!Y2w+jEg1to$k|9Roh0zq{A<1hEU@-G22SiL)2CRLLB8FYGNKTXHa)l z9z|ZMjsEx&n@pSr@|GI$gB?{*e?ChS5+R=vM`Oiuf6CtYAz+gz@j$M=CP(t=kaA~mQR(UKArsj3~b40ZgDcFZtT{s*FGkPo06<&W?E|ffuw;PwnC!l}!5f^D4479HX z%@xEJ!raulns8KXpiQ{Mt#NC6_cAdnYEO1r!PvQMAx9YdDaHXws}h2Z7k34ot`cPGgAn1C9##QUESXqA3jf6*$jC1D!~k)Sh3M?lIMp(bE*1yVqhJdb=ZlJpuETT&o8 zwwIqxSUBmspcP{RSzf#n4WOX+4wi8}k!GnKXPa#Eke-=f;5e=sZBTgyj^mZ=QgO%_ z0}Y;pr^B1943ue}VsK}tV<;`%6b)(bXI(TV!)()D&$h|Bl@a!KbIAbK0!8S zN9$2*xaAQma7hw}~aYI{FvHqy)i?GMOE3K+z<|MfNkr z)u1oa5EIvzKt3bhQw32ku&0f~;pGjbyvUBtvX!PK8a)We&7CrioDE#b!im>D;lNtU zfoME$VC+#cahQkfGWi-0aqK`C=qM-9GE0q9>vAPGU+cT%`~JRy^8B69IC?AipQ5=V zP;~XmYId&x&FF)(F*s$ z7wl(!(ZYx7Z{&@{hl$8B=-3qI85%Z=`Rpb(!XSiKwjqhF6Ngta!fJlyXrYk=aRdh% zJF(VHP>&R|!nTUl`ZtK)_XiADBjX%CJ@$uiJsS5s%LRpzoywHb_1+|Q<2ihglUn01ABfH2XXYn z;tgjZ!?Z0Knzycu#hKuKY2=WQp+5mCXeK(Nn}^fpDbXr5v)8u&`*`wf=%Ccll24M+g|Svv)*P$WbhAD!5uzl`Th~I(hm{?R<>R8ou@8Z^gUN=){`D z&}gtb>H8CJ(&3{&V@z*?J4|Ut#b*Rp(}Ru1O6!r@kLkMCKh^}^bNJe=vim^Zm>1W) zruDn@Vw(2n4NHoa?SaHtT#)j9%uxtc1xKu1C0#e~VQH9}rH-fyZx9YvnTZ`1lL|;S zSVb^(0O8Jiur{ABgHA`{q}bLjOJ*mTiWP5=n>`eyU7=0F0aGdt|x0GP5?RM z`@Osi2@1S+_Tf8=+5`M)(Az(fU7^aN3CBS*y&WS3DmqZJBjAcW@<79X>i~z3%)Qm7C3#rmO#hRu9 z^Q{;ulz#q5bpPGDLlA5>0Y98e5>lG`IK4-|I(-I-*&_bJz;Kh{gcR6$E~VSqY}KC` z10M~qi;tN$RpgTOkf*0`J^R(!Q+W-gY=R3^!t^FkD!H#ZQSywdEDykcG}1a}N!#Z{ zA!T*E&(ZjpDH6)G+*Zy+lIK4oKG;<|WvBUOCfPcFVae~*Lipk#@)i)bRYaOEL%!|s zv=}0Qs(5cZ$&XwcZjbrVXlO2tZW7~i0EPjSZsIk=CUU;NIpZm*4vh`%2YkK?jw{&h z8RgE-m)Nt+-ul_OtiAe&i@jnz_Frv`$Jf}$Cz$7Sel*5wNkz)WP6hAKL1Q+Xt_QLW zmDf2q%pZ4pTG`8rw$v%vn$xfqledJ(Doy$Xtz@biQO6JcfA;%Tx5H*FXK>08bHSPf zcCd8hJ&y3a7!2}NnCFvMWCyyn(Z9#n=9{q9&*JHqY0rS)S`_M*kD>F^lU<~WQNr5dOYRMJKYJ)DcaE1%hw4WE!?|&x z<0aYlc&CF}j^T`V6C;x zLvC<L*nx^eb^2HL#G%0^@EF(aF~r#1vF0@-)%b!yGz{5Pl=#iyfL=FMaB1+6^Xm zrG!ywcOwxn|GMQzk~A(O;=a!WPwz03C-Kc4*-{kc0j+<5QIK3PaV?{@aqWf-s3=-s#;=f_6zoBgs43VE~Y_^4hr&CORD-!!nb@DLPpsLEg?fA0<;QaOv#k3q&4xc(jD%d(J6J6ga!mf$U1ueT;-bbTU)Hj znZiN9C-nx@K~l3gtm*R<$9YWTt}$a>`IwoF#zahG$gn;7=i4SBQqD5i?~Ut2 zH;uhLs05d_M8KKd7;9n&b_sHI9sB-_?*3hM+b7XPHtdu`n<4hsP)E(2Hw~FWl@i9J zLxGWi@3ZH}muMh%bsCelk=8=AE`AVxI-Djyu|4{dwu_Z;eZBwTtPXfcdV%rqSSHvH zLb0sH4~BmpWCRua!gX=OmPStXEFn&rVh3gLjX^1m5roRG=5clJ+g>wM;3fQspyHungRn+zZjp}TG_ zhDXj?EQPd`Yg5*ya#(t#ex&Pm1Pz7$E#5K(t6;3>euc!-wU0<2l0F_hnV^1bP#vM= zH|L)AP{os=VdJ+aOORX2k|C_1Za@YxiurG zf4r_5nN!9_t+Rm-D(%#X z@F(SQ4TUnfO$=L0h2%~a@k_cHN07V*)4L^AJlFgpnu*qTetWl^GxSH{mI<3U7Iy3` ztEDX)uW?9PFjz)>J1Xj2lzfz2iibz$n z4c61%qzlY*WdDNwfle+nf$Fg|e1UNNYEnqz(3;h{ePCFRB?I@+j>qBu8 z3RO|sxXvB7UUgUJvd6daS;UsBoz`9#E_vTh>rEHi+{pLFzI1W#ftlp}i-$kL_Zz4> zoMXCPw5xc}TW775D82P7e`fvk+723b=pFZaO+T`#=Q2sLne_0xQLdT#pO{(Vf5Zhe zy57IpuUJJy2B1uzDC(b{_!RL3SKW21f1{P`#myKX+j&2T`^j}oDB(^)y{%!{uMym$ zI&aUAUr&ogQbY2-*G6Qcp)vnjm&w=`%YJh6>Px;epB%(R;EFeUg!?>?+3Vhra*0Il z)7^{5ulxDG%0JqcpSDhTMiy&@WM1>1i^KiZ4I}uB7#hFw_QO~IV?<(Hac-;mA43f~ z{j!?~4XoK~r~d9i@hl1?teQ5I0n9IFF(?N1K@#KE^=kE1esIHY$OMx@`)OtN(T!kizf#nY?KlY*^`q?dHBTvdr^9jAx53;nnk zS201E)RLTIX_h97F?PWrSzwwHK`Tf`ZzR`gP;7-#7%yYLaq!|;P4ZQ_)X~`zz1&by zO3h>A`$R_RSta9tg2Co&vK5a?O+ZoPqsBV$%(*5b z&rnfW(L4^u8=EJTEIPMF&|4xfv!>2zTO%RKJ41{p(ac}^IOk5yG<^U*UBi6Xjk%uR0* zIl|1eFIj?<|4#lRO{bx#nZ4IvWf#};+a^B>~bT(%{M zuFf-x=fQglt+Bl>c1Z83N2FXN=Ad^=k8HU}P&f)qshBU#zD>Xwceo{NfV?68XX2~n zvJTfXMl(I4sebeq6kiqxiylpSRXmxgM){Lh1v#NX%;UplBx#CN?PR7DAqp;s2s&u) z_$9y8EyUOre0$W7hfwGBM?tvqFi{ZFJPBg*mSBb-T%0^}fdRWr&WBTx9!b~xXj5^W z_ZvSa>vap}mNtLhI`$r4E_*b?D5?Za)Akaj98kaOJwDOSKsC7x7hKU6#UOpNo&N7` zsCn9pE@%r0xY?4-`5f3OA8Q@n?6h#(xx(BMTsS4+p?&{mla`?KR;a3=^WluCw@5I- z#5Fvo>Ypg9Wr3-xqX~F$)9DB-r08Q;=c>4dVgOa(Q2aiw4MQi;(?h~Mc zigyJkzTG)aC~=p6Z=BXHxYH|uvFHjHk@bgm#kF6gNu}%c7`VOrl2GCqa~u1rj7c~q z0mt*$CVkQ#G-CYIVZ4S}TlrhOpk6%f>X0*!H&74sHd=PcGZG1S*Q+Mtyf;ObGoyjK z*`QO0aX@cwqg6^aw%Jumwy$6VXl7-^nCN~eBgxy=aJ#pHmp39coU*T@bJTsa8IU!k zu_&=hAq^Cg+1i5PpH}rEoOesjaZ>kpi3R>l*{%k|7@;vt=)8*GWZC|uPT&}uQxM0W;K?STb{z7tLzowi)77KR83Y0E9- zIZ<2Iz6Ngw3nl^h6`n?HZ{hEcS*fJ%Yhtq=XoA^6h}Z@)_?)Q8(4A{I?5^>1huf8* zpdZT;swM^OJZ_aAhI6b!O z6yP#C)?=crJ(=rL%USJU6k;THsmSm*JBf@jQD{?+d_X^)0O4ugpm*6evyMCLS z#SG)yQP=H%p*GkZ<9);bn!u$-q%g~SQMII7Q6KxFoUxY8|1AtdC;Am{R*d1CKS}0? z8wl_`)JZpnl2j_kF{So%G%c}K#sg0gs$7DF<6j8th=iF-4FlT_b)7vl?$g}wOSpzJ z;Z9Vm8?u}UMZ$6sEvgfi>@#p{T2BH!WM^A3fPq|ChUtvqPE{k#BwT+`D zn&bGST40NLMDq<+m5&dIpTONHN*r<0AZf|hbRJS~flFFTQ$d;J)$2;XL>TLsG)%j1 z>A5))zl?=oGk=@>r_f&p&A&!QYg#HnMroSY4@DW^2cgvx@OmSy;xs603Cci?nUFQi z?rrSz?v5%Zz6eyM^MFb?PN4Smc9yJ$WtrIWavLMj+i@s?nh*C+27@mtyOt0P`2lcO z@fa&L0;IO9C7daBu0Z3{u;3b6=H=tPn>EjeVT%b#^IeC9T|*8P@AsJwWYmX;9=BGk z&{3aU(-fv?^wCY<{&XI*$Xw*OQuV@*`$e$q=~{Ywho3@w3wZk(ZS8eH1Eea%kxD=+!4c>KCL_UHkl-7xULUGe_d(zkxIq=Pc|`?;;%*T>JK z#*fY&d9J^xtU5e1lpz@KJa{?t{F{WE@H0<}SuHp2U`rj(@DG5n zUe>k#V}E|9JbGlUfym&%K{!ayIT6y@I=IX81>=uXVm^`R$P>9ELB1g&kK;Wo+L(Z8 zqJgIbSvF&ZEL%zRrtQ~AkFmcO6_>tM_}fX;CsDZ;*jtPLY8{6A0a}NJ)*J5;8kka- z4ssdB9$B6f_{#*QY?WIdhp_ohS`OT!i)Fz{N~UL6%gLe;X4A~egd3$fc>w<~Fyv&?PAQP}-Rg++zu`UB?ZlUC zI$Y$jl$<)ZuF8jo8^`uu2$Ij>@}=kErc+pbs#__rq3s3;b$)*agzE~Z^R4G(b$(9w zAE+@(%RhvO=Wk^}#LF36E}kttve@eDw5f*-|AqRxUH3AI2G_OvY(4`gH1J*oDI z236iGU~+d&b`rq9;1yWg!9JTIMJgIk_n=Vq7ucien1aFUH@)=E*37Np?)&x5KS~W{ zD}r^7aH^_-MWlN(ffsdqCxxEZW+m^;+vxplAt-V}*<2$l+v6uBXh<pWcNeMFQ3=k+lLO53oS|?iW!QW2p7gvW>a$8NeF@(#~=5J-3hkO9hy2xKq z8_2PkAzv7vG8l6;i_k_f#voFSoVOV7gS0M0wVT{sQYa)+;OceCOgoaXRoDKz4Jbd?C zRPuX`%90h$+H#>*t@>`0_8fG?y{v<2f zS703_t29`kjH-)`jkOwbdAPwkMsJm;Ut5~k1_$H;_v|E zN6qjyNW4cnU&f>8P8O!3ys*P$0Lj5LxLs1_K(5^3O=A2w5sf=aVNtFeo^J8}y=n(^)!{Z<#vAq2-izfG6ZZblBe zX)fTN=rDh;I4-ULvzrH16D|bVJXVsLQDpg35PHxz`eKa9&M(3g_KupU9DZT?C%N7u zL?Q9!fbx#QpmC)>*0u6{%EW@QTRU49qp_!^Lcfia9^1^|;?X(Eh?Y!HcWfOTlopMR z7&lea$vh&;$$X&S<6Baz!A_!HtsNUoI*2odeE`Rz_*g_>2oeM%YzD09h^b^q#6~4T z!J9mZ2Rsme(y;OV%;h-y(X!OMdZTe_G6(KcdI!N7&PvG{ANTifm{L(r80Rep4^o6A zY=%gaXB8d@gC?u(fypG8Ld|K&NLGS5)#@3gl%fJ*!#e75G4L){+7-A~A-NIGkWYJO z+`%ZUi3Xz;3Mq|-k{jXM9iO>jWnmJB21rKh+Q-!H{Tdqx@+? z&FqgDJ9|h!iI;Ry(bdLlnU(T;y5|i=vAy9?c4f4nNv$80+tB4};^45RfdJf<36wyl z10$ON-iZ+`kZCUkX&Jw5gvP0xTp7OrkdFaD)pgHfP4G&Z)*3@k*|(pf__X(Lc_XdB zvl%sDB;Jod-ho(b-m*}d1q;g#8U|*Mlq2QTR*Ar69vzet6&)C45ak*H0EmFeLt-2~ zqbw~cRc5&)35(#CiF1091S@@TuCdFXVO$N;Jk+vK7I#lb+Y^GdoxSOqWReNFM+DEH zo`wWzmOQIXJ~Qv&Pf1+DJv%49{*kY={0zoCij3plv<~sD0SGK zM!OPcuL;uT7{F4e$o%We7!4mL0VppZfbzn7MR~E;x}v;PW5FjG6cDvc9(Yb>qsA4b ziIklL$@C73WJ|(lYD)l1UrNLp&FuU`#ZcGH&3RW0z#Y7NEshi@6*ehkCs9Tx6)I=!bOi(8SDga&MhOrYeTRRom%ALeG zvO!9l-hjbu1mL@FZ1^(et%QD(QyS-BalzNsZaSn@tfV<7Ir@VV#%$n-V;M$on$-6A zSlg*YDFRR@AdT1GxB}R* zY9f4`Lc#D%K}bNR3VbAUO+$ZTu$_U9k3&y!%NWcPw`HuYgh4i6#3odQT16)yL(v2P zfT${TiGdD&%~KT2Q}+>5l(%Z~{AdY@GN7m`&XIArrZDwOUnDHxCr?(fz}Jt|X8WtO zW}@mi2Tl~3D<}*GH}~c#t$U zYAE8HNpy|nQL3k*vU*vk_3)f_`$z8lY(-ZdLJnfboo{_h-7qoz;Q6~9EauS}2;}UO z!9v(JS}F}5^Dij^aYc$?R1+|EX2e~wA`m*-i7CBqXH`I?ykOmYdl%P=<6eGQSrL>+6%a}}HJI~A<5 zsSujo71Xea85~I6lethmTbcCIpz<3(sZIsNR8h2peBNLO^)Im!d$@&!&06-VLA%yV zm|_?atzl(?J~*4_mPaZJ!8Lx2{fVwWd0)&s>bbJP;WE%Y)J<+r#wr?`Sxm-RqVXdj zKUV)_I&0-4Fkl0wSIN@y8X9VIIN<=y)ncGRSbQ{807gb>QVF|(l%Ek16JTSGH{QGg zS2p75=`H2Y^SJT!vX$c{AFE?PNj@eptJBy&mSbQ$Rzqzu!xzuqeVF;vhm^}%*~Xw> zh`MNSK!}uU4oLE2oD|Tx_-(eU=?NPUT{WYSt$K8HBor&tm^~gC>e<-o{+*9n6&^(ew zXEoQZ5z9unZkI&?YR*~{Vic$b?kPE-1BTt8A>Fb4A-|(4NX+73 zN^)X5)<*YTMr;zpREur0uo^ZKufTR9Fpf@3aT+hR0QE!i$1{_t^EEScp#b23a6FTE zG}fOtlaxX`nwHkV55kh9=lBPbJLy2&&3BW;k)PX?&%nFCebokVTp}2_syqZsB_RL+ z7C1`a6}ov@Ox_t51IfN<#kza))*jkIWZ?IVTWjC0b0M+h0ZLV31v*BG4<&wTWlHdW zHG|lLY{(>p7|A6Zyd-tGWGkT9ysVJAO7hZKVcA=l!MP1RuT~=&X{EQ=8`07x{GqO; zw9Epu%(WW#zZgA4`MBq4+f-?%bZ2{}vPeBH81wxeOs^VrH?*te#EhhRo-ND9cLxHOgzFiq+wh5ya~18 zs^0p^xZ|YH!st$V;XR>n*5+0&@Ygu+BQN^T?dOKtRc%yNBa>akv^jYO>hTP(6zuvm63Fbzs1;gq2?LAjbLwxBvhm)hj+_+EU^Ymn8K1 zf(s?P_kA`I4lNdiE4mSzIDQ)dAad(;mZQj5xBu@yjJo}VH=|T|ZRT{Eq)dyLp z4YGT~yRT>Bnk;EsT%Ps)quXBOu*f6x?hCR~#?l%7VRkZ)7k3zLvOI#cJ`OQ$zR&u= zDDLO)gpM}={b!$fOa5`ps$5_l{hj>$iP5iBBxQ+;tqBLlvM(FCP`qDL-lf+e6Ken7 zY+hThPaF4Wt5(uBU)G8}??(EtdW!UdeMZ0X@YKMSdwwQk%i{@kV2x zoCqaO$!49eFX5xIHqP5mInp%ZLu+$SH&3Rp2MeL0goO2QKce&|+a&Wl|IUJ!sNc)h z(PSZc9(?V+hzFAErvCagY zwQyeI^cLHsYt7^IbncLF-X85X-n+v{rhl-c>6#}17+fN69(Uq?au9p8ZBS^Yz%!zZ zw9GXC_r9=yw!!)rhVmOGJPS6;0twUs#$ubvTSO^gFVsJQB{}kN%Jhn4lRT359Ap`U z?Muauybo-?2akncO-5wS5|iH#RnL<=e{B{ql6wp}G18q>9T-GDJ(+X>1?Kg03rHjY zVQ7)8=oE*J5-?xp7>kG}vz1P6|HKe{8VqtvPopeUCTsl=pu;m#fPodF z5yO*ZR}CA;J+}5=#2%=)_;3yl`6781QbH52iWS(~g<>aTOs0WUooBp1miOXHHL)bMVPx2%~=GSVn?%`8b#=97LIvc6O&t3H-vHG(R>xo2QjjQf1~I z7p?9=z)qNcQ?(agu$Pk3hz9OI$Dcuf<8QZpXaKAooI=M9lKx*t!+!@uY%Xk2r#sCF zo}`>+;|Ey?N*(r1)u|2zivg)xB#^32XRg)f_T&Iov(#6;e>IW-kUB|M8qi?i=I3D` zJ_S8%F3ZF1w)Z@#Wsaj}vFA@b%Oq^&VHXG$i?-#)ND0Am5>=vU~DC{D+h(y$Pec;eb~#*q~*~8w&j- zq4bu6#U1~mHq${I;N^>NNk4b5PfP=7ddx}fn1xPdQ#x@Y@8s z^94U{X;0mRw`!K~osoHNv&ScR3O%+XSIY24?Ir5KL!ks6_7fo2KVrIa?Sk;6ZQwRh z00JS<)=`S>t8In>^{H0Z;cd;Jv}oSJK+PF;U1r_QvzYD!el5p2nHoZsf0&;LC!^Mr zaoPf6#0IjQp*C5`ZklUPsQr+oY~kT%_-bwfwE``eP91TRVGF^nPC!N`mVd!m#EY_1;-imRBWOrC6_X9T{! z1@TAC2C1BoyQ&V*yyCS49%O=9k{mO&MNfBG^PS3YXc|2onW*Z1FE13&QhQ+%z^8%{ z|HY$tbp_KBc52Xfd-<1SqV6JO5ELpggE65*D0O2ZXr(j}Wh=7=FiW{!W;7EMj;ajF zDkra+WtV-Rqc8Eqi_2#*W6GVfl7t7ES3!D&!YdHm(gvOC9MqV1lQ@_^2`>Q_zmYDC z);Q*LwY?JMfrp9;cthe;{9k>2Ni&&p18giKZ>$D9(uhe`Slww3{G;98*iz4XF^?!g zZ4;~u&wx?_;0%IHf%#XN^vF(2LhCknh3YsuEBM(0QCz7D?C-Uk=v&}78BBmn@EZYK zf-E;5BnuY)f6P^*265Bwsc|k=R?%_5W@`cfKvZS5#6Sh-^W*}vOfjagH=!9=owoA3 zqH3R~2yk{$w=@daG9R3PhJXyG$# z**s54c=*pqf5#b+r}Vc2ri`u8M$x^DygM4i5BNTL2I2S;ECF82h^Vn5s1$z!Wh;Xn zqc(-7#42U&LG6d5Vk!qh*L&U{;BfnD?rO$tP;98_g&DDEVwY$T zv1VX~!39TYPi+r3KAVUPR+>L=@1CLWsaI08b&zdq?k5gGczM$BFE?gE_sS#!$}o20 zrmO{|E*ce5^gPN&b4g}i61a@eX;B%G_{!n%-1zkUNs0?{J_rp^^N@DeDm#XXsiITk z|JtjDmBtG1Ipi$Z7or5vMMR+P%1VGib1cLKzyvjKskqGx!RH*`mG|b6bKjhl3wp)! z=5x}Bie~y#iIHX$Jp4uA{c(0m>h_#DUt~WlecBOZ;Ls1HHNdgs)c`XzL3>fMQ7L=C zcQN1!r0hj0Mj7p61@_7u`t5BcyhuM8)N!r3_Bn~{Wkx^kg z5c(c$y~pg}W)9OhLfT{seiwH);s2v7>l)#M*{t=Fnksnd9#DfhMZ@%ay$F^`>`SeM zDFEk2ni)s9PNqJ7oj+=m_(zmR(hZ%KQF^r6wt@^MdM5z$DC`~dIU};kL!LD!Izyer zR1Bn|zKxbiQ;Pvu>w@lx1OX{`M!Z0PJ7WwGAri>l=|O8A#3?iq;4A73qa08jESM}K zM)0MRyqXKIUdmy^-{|S8g~mb)CSM3JxZ@ZT1SH+1z7;6NXnzyo7u~N&DP-B(yWwxBVSW2bWP$w~P!2p#VYkD25Dy0j#8GKbSLlzLu?OuqnGU z5Ki`YpuoR0*8YiFTy<=RBiAr`5{joX{c z%aA9GvI~y1WM5*}H!{_WE5pZI`l0T^7BMDJ&})-Z!+7Y=V);!h@r20`0U(lBV2a@C zB~`>7_l)62ICI=#*$v;Je8*Fx%+O0<7 zoxry&K?jc)%;w2O=W1TbT{h;hEJsWrspChsr z{7ldK{;cOmLScaG^MUofs>WNHdW4Z8VawVdb$7{R?mWB2z>8ZhQUTpxF{w4RT9_B{ z4v$(5`c4p^n-{4Ri|Au)FsUyO!I(GIX3OkYC^7C^&LxS2Iq@dkKBp};vurYIpbONx zhTpg~v~{9kHr3g~pljX~x2`<4|+--up z%LaFMcL+{!Tii9cyWP$EtNT@bb?g4Iy=P`lPfg8q&2*pcexBqCgGue~!ctud)e`QE z(nF2qR-1?teWe^%Dl<;XVEMU9Xirc_MeID_RiS?#WA)|j}4gMgUL(Zm^p(4r6nEeO*iJGN(PMp^9YX+kKrC~xh|I5l?)04;ENm0IF z7Xb*H6wqPXdMrJ;iJJzBy9SE)KRI+(@gq#)L&yI?<9c?1Eo-6_?};|=*DkI zDf!hZh+whPHM9IgrVdunexfD#U|^7-v&x&de424XjXL^A#0QU`-+#F1A%h!v@5&t<;xC89n%27K%*+>+n!9 zBYO|BO%X+UqPk{Nu+d}FW!2Hl=h>!);sFJG2Fd>gdqdDpL0WZ8d`~Ba^y4X$Z(0_*E`|!_3LV@15 z#K#*&GjBEbHe-iCfwm|d8=DSdXSULiz2({gQOAxmDa~{nc#ze^kn~1#S7+Y!d zXUHa@EWZ(T9-@?34LfP$D$X&f2+!m@wF;5H=plT#O3oMPryj9b-%fZvMMe!NgifJQ2Bm;VJVth{K^l|hJ_S&WuH zehnLFb0pr4FbWC7FMD41pTC@4pm^ah*h1cAjT0Vfs$ zx_Kx;lzH0UNIWYT7aA#~z#xNB|8JUA{BSYv%JL{dJ5@C1fsb_oT0iUJvC7n_oDjp+ zD4V-1@h4i|F<43gj|$hH0v4P$*zz^&TAL75+lyP5kTEXjnnz2mj&)Rob^G1^qJa$k-aAe z?No~DR4V&FNxT{@Z$H@k5vPkviF7JNjNF^rkrXc;yO=lz#vuoVnw7EY80pV7F?t_u zf?KcH-?vc#+xpz5?e8^tpvT!X3q>>|r1{nq@i8!ra!RP6$&*A}k0tb}1Lz9_y1ast z-HW`U$W75J9vK=##OVWd9TpRDF2|ie{mKoPRDyF%_)YenRqAbS?wO{gCM%+Hj$~jn zN&}*plzy_fs+gGN9!bemSB7D6${PVf6$oxr(z`qeJT-p~+^8ZQt~i_&EtWX7$PXNi z*ya#Bv@%gCRYL?MX{w(QvG{-dZ0LlCr9@6It0CD~H^Q?FPe7k7<=8j=W(n;N^wqKmN-LqbkW zNM-N9cGhn}w=fc-Yz|8-Aitc50qU%d;eUeqq_F>UO#h8=d01oJH5*)^s(Fh%VGW4w|cUlgs#-^9D0y^bP6+k?!SBxLhr{ zJ5CyoFn6dgEA=;mgj8mAMp#yx)lGa)+(%Uc$xw(AIFXkCvvPAsGP_YCNQ0$fpbjlv zKMG#ANZr#q1IeBL!e2uil00NJEq_SPFJU&-!YpRI5LCniQNvA9-xftmW{$W0L6XK< zJRVs^xW%&upU-o?OLOsma3#-`BR(olWA>b=71X89Zp4qr^)x zFK&=gURp!Ypvpk|&#ttl2j2r^RyD(H1dGM51c{12 z;pXweJW0Z{Zf7u%-qZ+_%0p|nIZU4w!Egn1$f<=MLD7ilyo5g&k%iw?$@_5}@8&4e z0m873cwvw7es-==2sH3cD9G5UQM8d%tTXvp6SPQQsV8VLz8d`-ZBK~ra{9V`UDw0? zH3uEqBYoYSNH{n7v~BX~$>h_K$)~O11ZY>TyF7IjEry&?6||Pg9Vy&Y4Z~Fx{Wqmj zw4Kr}U)e@{@EVyV;4`og-s}E? zRz0f03j#d0vDt$V*Laj_0_nfxO=P7r(N2K3*K!LNOeKR+Q)S zpEK3W^%h^BDqpX6piF${LOu^b@auuz%fRcU%A@C}mp-CHy_YS0pNF~3mtxDa-3AbS z;it8WQ81pUd$k&go>vE?peu0pq4OCG28490xMVk8RKPZ=pa1Lx3lz;YEInUb>qCGw zm(gq2TcEh}5=z7;7Y;18ww2P~n=bXe3xBW;XHJJ;&ll%6gh)Ds$YaK^dve#0W!df+$RRi7)b`)H!0Z$G42|S_!PX=2KKG1+? zBurXfWbK-3K1q+fNp%&w4r;?UJ`s3s05fUA69cDHsNV9+)+?idAO_E6uW**z*YaoL z*N&|V^f`(l&}Z%Tas3y&OSXd1AFmhhLKt3nRo|;0z1~a*I?eu)7F64X?f2f`x4Q zZC~#$8ecC9dF3KYgX;F%U%PgzUc1zy1c3!2iq{PVi&y{h@tK5lG6xD*_ol>tSJY@9 z1D`+thd7V0@pYpT@FWv0A~tvYxu*C)2 zAXP%p-?Gg&cGYyA`IOzxyXCQz>L^7K_vb}@dG}I{9T*z83ZYuEoM^uxR9DO8dUc);d$aSWT~?xXZQi)wmaq9GKw0xN z3dg$yR&&n(3=9Zle>tiFob7~eeQpcIj^B4wX$g>Wxp^I7?vfA=zAjOW%hm`{I(Q1# z*>ya>G;Xbp5KyDTtq1;UNhtQxvuP0WTkkw5oDh1|e|=tiy&C}TrYm1BU!PB3ZyJI7 z*O$Fv3gG^brBju2)&@Ed>Ui3M{_a_X<~B;^!YtDkg`!|B0EMA+wTocfM|~giE&k_; zev-LuEHWj73-51@Y-5~gZ}<5HuQxPT^cgq!D-UP{K&#f%?d?a>WpAZGi75Nhw`;Yt z#+%?UA%vrWbJg+;?@PhfOD0voApWfdKj?8q^OT9gpY8r=)e;6e%#`(dldZ7N>uDv= z0!90)K7s%X!wNIdgVX0^3#6A6WI75aQi*g ziNC`t>%dZ3+4yPz*B;Wd6QCW>tgE)F1zo_!Tx0`aEh|fwTx|GR6W-}|D7bJ!N(!28 zktUZ~{r4c3Abgo7p#iz*#)HDkq*Ae0T`4I{iVLPcW#bcWoMB{yWz*9sG2@?|!i+S| zUE2r(6L>#HR`>bn!PSt?7hZ%)!7kE>MTSG@8<1ZhZ<}RtqW9K%P#+#*N^;#eI}X3h zCa?iaUr$$G3>Az@6l&)Cw{sdb`x_KK#>XW=LLiIV6l;z&ZbE$fx2ClCE2F_TK@Ucf zIKyo45%ds$S+@)D%g<`g&iRY2y#0e?^Y(V#Q~jnQ4r|Ut42_R34p+w2$kEDENwno! z1s|f@rjH~td{C}Zvk;fGyVe~z)z;$AD=2{du7*8bx)(Wtslbrpx3SSK9Xn&TqDkWq z(Qojn@ zV8)bJLu&rFe`JPHZ9aySShJo4db7cHkD!_vzn^iso8<#zb`JM zvi1&;KQ%f$3h7%BIx1f^oRA{~9D!621v&w^;RH->Yt6YzH|?0C=OIV`T?Qq(iD9KJ z(z!#S(Y|FzSyX$*uEkySQ8*zO{W)D2|FLA~8|EuXVDdI4g|E)JTIo`7<+^fufLv|# zh$;Cr#Nd|jO0Jf|pmuwYhPT#O?L7pwQ`EkZ*F@*(;&MbiQx&(d3P>}1ZcbeK z__InR%RwFkU|29=V7X~wvB8~yaEMD9a7+Jr2#JS8X=P8#->VU%Nj4I4^7EMNaB4wMahw zMwfJh;K3j7nUJBCU}l}B2RM9P-Q9SeKiT_bxBcQ|F_lO11N0btB{x6IY{BX2j~YGD zKGT{V-rY5rwut+3V6ExG}8G;sr9QB=43} zxLxIAnGIR%Tt2{^yOqn}m#84(->vZBWouTjDuX&5Reksuzq{W*{YXs66Os|A6mqM&!)M&D0@;BOB8OtpKhh+rh_IAzf~g7Aog)Pvdycg$M5d0&`RvB(38Qi2Rnf>ain#9q}L7e zLwvRH)0<2hQotx6?vhpSE$yNR{9QEK8FYYOnqyS$1dAoZ?Py#ws2H~yh>e}PfAOTR zxS#k^Z|ZrNx=1h;l+>(yaJ6&WaIT)1aFA75edk^le(wD9%b%syGgC_4a4|>iXcIAK z`_qv<1quN$i}TWe;bCKV?EPN*wbh0t*&x?I<#)lPZU7>OaC`SW&Rcvp%&7`e^1WrV zCN$f*y$L%wI9w=y|9EqN=6zRlbM*m8$6z6Dqx$N{S+0FKHE?pr68j#K1?_TQ`ca;# zr`-AMZ`e$n>F4>X9Ixi!XzyO{$a(gu3w(O-e_o?Pr8}(cu=Keu(9Iox)pBy0y-0uR zdpU(pJ`gZoLG|60UjK2(Mn{eKK5kh($-R%cW>r&!mO z>ET&<-~58Jry8tL3rZCr%~@FtY8k-ockeM|G8?g!`IB3AUgf-sdzSeE#SqUl`S|-m zLQ&h>hm#DWO3h$#u_jHazzJE`(x+-?1DjW45qNy%_Yg9~TmforbgnkdDB z0dDIHI$Fw3$E5O7RGNrbSUSBMqv=j&3)Xk)o%M%hX6&0G@_hHh+C2KsxI(uqGlfz! zbLSM8@R`r%DR|vGiia!os@7|NRiZQ~$Uj_bR27fuZ3%8Y-}k)lj_-7bBbYJ{B7iXH6b1$CgSqK-BNHFdNmnTT*RgW+4?Pv%UcW!%P-68 zl=}@nBd8uKk8&@uWa=a0EXvfS0&D9WXqsB<09#8d&(z5(xZ-Z$AC7MRqgIuYUT3cq%&5Z%fC?2Lb9xZKke5yETDgC+>!vrY=&FdD!W%$;l6xw ziMj5EVp9K#?)2BseJ}@VEB)Fi~v`f;)aU@9&Se$I+F4!}0BR8|tTVIvQJ7K*#2~r_6x2`|0TF?BK$B z$Dq`eMoAIqWmobmx;C>UlkGK;hJVT$PU~I2{Qc8--IjCjWv0avk0zVY-(%c0vvgGZ+UT-ZUJ6q==hpq$ z^2|qxSqNaJ;Vmrmx4Y0Mj0r-qBSmv{Q~M!v9`ohs@oop4e$BA8Gv`0N=h-mCv>^2R z+Vfu2<=kHioy6w4ri=gL-Rb?*xolW!gNyozzt$c_P0H>7VVnkX4zC&%1F`QL=rO1x z#_MykDWBD}{+h_c2_;VhS?q$Y9^|QhYGk>gZU)$!7_gRn?9j7FbzyY=dcsUteb47v z42o;s!DAWUu-&t1TvGSUsLbTMJxQBCV)@9@>Gx=<-Lp7#%B!gHc<<@K0-DxyJ-OIt z%Dhu9uB(5%f2cTFn@l~@*vwOA*<3d5n5TzZi|YJT-&2sjdKdVV*m$fy2!?O2+^Nj5 z9RQGQz>oI=?Fb+3hsVK4;d0>4Y#%*Q18)-omQw?5=DzQ(2|LPZg;0jrC{Lrv zA&27uwT{kUbY%?<-^a&hLG{_Di*9400Fd~idm8JV-*moflfCP#e`KA1JNuh+w}GXz zt;5I8edw-s@)(lZAK3m^?%s%j)Z4ROFSM=I{4eC84dg0$0cyPrW-0+)7jy@r&qa?# zbgE|EJr5`~5LpbLJ49Rsi58R!LR1P)$0 zKJ$4JC5$WGLJ0k?7hImn#y+;axV1R~t;tOK`pnm>cdH(*mt6XSrAN5RWnZFA+b<6S zpm?#_Olyi|T3a*PbuSL?Y2>r*WgQ=}JE``n+UG*_RieQ{0?+uM>>|^O1CJ9e_UtPPN*7=me<4!Lh-}Fw% z;8eb+19!Q)%GhyaDa0!>q;&13c&7Qw z)Rql`?AE52yE$1u?L(=q1vWj=aBGTTY837%XVC84NQjVf_FKxSAQkxWr8H12vk`AN zVB+TT7f5&4{d?)Q5?QSK+r>VQBnZ<=L~*-^s)q-)+qbGYWI)x{LrtIGOFgd|&=mj=J}ptA1fsAE$eQy61fk8ujMW|J@koeoX zJjk6Y@FBI#%s+&Jvky;U!sm$fUqI@SBVSZ(gIwo~n|vN>N?%x;4=YVFgPk`Rjx53| z2wcj8?V9n94i?4%PNmXy?fs40u>v)X4E@BXm;BH9g2`c{U|R^L(D?m1N|O3hvra|J zwZ&Lodhg+(-Sf+-zXrJ#NKD51_BZ%}`rP_FNa0RV>sg<^f0*X_U@Dc@uz}Z#8JN)* z>{+u@o(+a%wz;|HrT7vWGXvqzbv;v~4fR`9%h#8GGBN?8;rDXGe4h8|N7+mA)gPSC z@6`m#RUJ6M4C+ueb_=@eYLlTI&d;`*6^(gr=iiMS$hK4P+gcAKPmP-L<08Nk4&F%( zLy63F)=x@r?lUUq!<$7==F$WQ@5%uo6zJz?pW*rDxrnORd$p5#feGB^=DGD1_)d6( z{^|HO(+80EFXq8NzTSFC;jJp`$#fU*32q}rEhZa$9s?WSjk zaUI`W$A#Mno)edOFO{V0E!-f$Qo{o>`g?puBI4SEUSIyH-p~Niq$MIShvc zEE-Vve$SyWr+MLkz+V^6{j~V{gW4`v^W9GD5>QTEIcCMP*g2;W>{%ZBAg>#Ba2X6+ z_F?Z~K74>;&^qcnd8@`MUVj6)tgcqI^Ewb?OYG&Hpxey6h1{v$U&YJfy1;9*{mLt) zTuH-z#`4FIaU%M;dDC{$brm6;9{Et^&oi!iBO0Uz4DMKj}B{in5O@uJ!+ z7vLe0!D|zjY7SwjW#{X8yCC-92GjbtRI#reQuEbhgf*QSRfI9%G+sx*Hj6UHf*gt+hQ9 zcSgFDd$cdLbCF!l9|-!MZE;U_r!?dG{@gA*UEsl-X*(EP$=>|zpzTODUCfJ=Njb=) z$5@!k^2bJol}W=zpal2&%-zKM5vG=jzFgx)z(=R}>~UkNi3Hyo%J#smUPvn_1h8o+ zG|KUalzd-(VSX4uX|i=gTz0sU=Sy&GeTqCH^S`Bg|0sZ&@qBr%Sl;XyiC++WaA-WU z*=ulWvMcBwLykz-xg~NCtKg}Bq%ulmN~n{20%v>QA8%J1S<)sK>Kd%YG&l)5c$)W)mnOe!OoT%W6(MXL=&w3)riT|lO$O2Rul{aTVzw7~Cd z;i-V`TW?aUWkvTEjsEKX(Oc4^z6Q{7hxfqC2aPX6(v7PzYJnsOsW+k5#u{H9N!F8y zhB)h;gGj}+O8_bKG&H+l?e| zdi_pK$3>e}KF9iw(`hrj%3C8{QjXU926N!X5_JB>D_8S`Qma5sVNR+2VQe{wSIjlq z6Qozx(($c`Le0Z_zGvB~Vf^cyN0V2qBk!xpK3Aj5jc>D#!Lxwt5FUPXaAK*5y>@ZIIrh+7|iIH6v80^=ZgbKJYk%zl$3{S{hGe9+6pks zRoP(Dbt))q-E6hF$U~wAVfvM{?lS||>AtLvY@n-aN6|ncENCAW6pz(jAbfv+UBxzI z25KL?ye<&D!?321k;4E-f7EBG)lD~ST^2gG{=V~Nneo&mp`zd6@|# zyR`isA%+PLyl#1NM+^Ug>5^W{?jE3U^|&sxUvi1Eaba}6Heiv6lX|p=Q5R;W|B1`p zgK{qZ^5FZ*i8`+LDYHWTo^5=1d#@awWb?7BzL#vALgI)KSX7^tj`R9 zdYYepfQX&6qkx4XS0Syho}DwRnm!;FQymMHVZGJM3-6P!p2r4d$V;SFouh!u0x}~e zj}FERALd4V`C0xgxba$#`}MjMgs(k2=KhAN;nxnli&dv1>UYn3W9tr|v%4+ycIfK3 z;A!u7vrQ(@oNIB1=Ni~iduN%TyvuZCv4Hl=|NBK&;k6TewLKl`-VPo<%~EVP(U zlCcKd@4rje;j%rpX((&WYz9X6$=3QKEI!f)k*=!6-7t8OKIYT7-E93TH`G8UV(w7u zc(O0^#$!3o=)AE%8fK9yt7R)dc_{^uErY-JTHZidl-KsG4hH1#LD$mEyWzO!-6x?W z_lXFGgPAQ#_|TqfY_L?x5o%WBEd~BnM}A_%@lQL>n1{OfRB{SoC*Yo0li8!)(t4>c zv%-hg+hcFwT}KA#=-R8d`(S#6 z{j&YR#iZ2GZSex)1)N=?C^gUw*N)y?45aO08UbR735EJgUfqU7(Wi?uvsut(xNjFv zo(DTp35Ct0+U>nPL3WOi6c?-~)5WPjH?u=^5_y$-jRK#!vTxdsP{;*0b|un|Um>d` z@$y0Fi{s^s)--0Ix4wISZ1pSjMG6|^PB~c$TQ{d-tE!?Hfyzd`Py9Du)h`z%CkJ#h zGbLMsEv!mq9X6IQOt=a(%`5^$ziKN4EO~JM9kP^ZXhXJ^S}`yQ8kn7hHOD7Fcx3T- z@xYC`#jj@o0i9}rXnI0^A6DmNGfhwSI#PUka-xiv4TFlO6M z4AyG$CDmJ6d3zpYZ&NK6#z$}5(O=b4dFQsCw^)GZ9dJqi!Z8aZL&>2j{ko2%niu{= z;A>vT-IdsqpvC`^D47G{-8%3{f0A3|$~OReXTV6_;#RMGITeIb111Z#dA$nJ9)P|c zIQXmtmTerxsSJc10DV&tm@!^!S1!X>Fv5;;vJUg?fo@|JR)-k zhw%bK%@1`It44S9m8hTl0Zb9{gWD;q&Ge_K^rYiZvOE&aO?Z35DUv0J!6<24p+Na) z;QRim(dDdVEn_&*Xna!v-0`LMk9ap8HL#T4wX(T;INCQw~VK5zDEtb-l3B5|3MxdFvEwev~V;M!;ZK<3~$pqn=gte+fND;{6o z8L3jx!0-HWp0ci*nZ>5V%zYPhjWW!+YV4jK-M`2|7IHbnGXjp5=+uf>QT;*=$hSQh zRSL326B{g=lHCVQ(CjTM8%CRH=rVGzsJ{|qPVHm_L^X;Kwp7pO2IuE7$<(~`JxlXd zRVFU9>$qID&&e?rg}(IYO$n|pY%WrZ-3>EDF2c&v z1ApI6S0YGrzLfn*zc>0gu0OvATy9g3-5zBR72FN)4YGKjPAAIFWrl9n*PN8M7|PJ= zR#*uUkjzPUz_oXR_}zgk{qU2Zd!;%Fk^t4F%(MCT>lu1FXhokXox` zuU3kli;?1wE;maq;ujZ04V4Z>h0QyQ`5^D2%~s6ovPs(pF6Mjh-RulN+ZinzV|A+K z{6q04^poyn#Nj@CpgAb_gUYop!O8_5 zI$Iv@JO#eoZRCEK*G>)Y>(8 zzw!j#&DBH4IB|OjqP&rr%-ER92HM$Nf3nFfSjK_Gu?Qx2c22Eq&cwAt7_&Tng-5eV zsrNK+TB)VlUpN441CLg{kGLbdVFwyJgc0OD;m(f3r_?_cBvgk$IPL z{GXrC#1iqhW=r5_&x}xW4>4!J2h4}zIuxH+dw|gwod4?<~iT(2?9mYSBoAj+?i9z-*A>JO9MuA z4eZe$7#j6FN4A~Z$1hS(_+N+Z2a>rI4^B#NHLc&-2ldQHxI1YlEuC*XE;6l!40wJN zJt1?mi_|&IeSncBEO_?GZ1B9?L%mgg6x0FkH7yFaqc$Sh--~%UW!vdrSLr4T-T2X1 z51Sw2QUf~K*qGGk-R;IVyxLv8sLxKptC^>ctNx#D=h*kY#B$oTvGmxS(w+_=52s4w zHhN5|m61gq4K?O3|1+@I$KAF0l^eOK6$Pf+2a)Co*Xn+O0>T<^ZD!*E@W8l&k>v8t zQ*f(JS?PGgoadwX&E{9_n2W)O%J>G=<9@*!;F{(F-`Mf%GlkAy$IgTIRtyVL4L*eU zkBcAhFWuG!vm7!P4!;QI+$1ADZ60^zUv@Ql7bfono`zKeHkaAQ+*K9eb1Q8k3PI}W zSzWg`*CL=b2hs5_nti9a8CLn53q2{e-tUJ(XxGjJs`~VXZU2sY!E*4}4m)G(=fi6d|NAF%}8%W!3PCCDpu_)1=NWJgeYakn@Y;M3>N@h`FxPNp-Sd@A~Tn_=92x=d}}*4ykVh1?G@ z?2(K=K208)E;HE*CWj9b2vyT<`<#sI_9%*R9j_fVm`?sKX0!Y%>T z09D_)HCGAgR2wGm!T-&M9@>tNo`ufTmm~904e;7@zk}|I4vW!Xzk>GNK?jv;0THVw zdw7ES*z6wqz{f&1{W|LH=@l}3DmB;6$y{qA2JPm+Te4Jw{-cK{7Ncmvy3QI?XSoK+ zY)p^G-YJOUf!7e`m3KOR*)i>n0fp1?=TgC-R9lR{*y*QNWLH}Xx-Utk4|nDb-if@? zplZp;59BKinHuZWNRk!hhhD#TA1jXL$tmgiIWA6%fdb<)dSTCR$rSI&))c4MK+Pb- zKQB@e0~GjVfU47z(q!!I0d%vJMRW|GEFQ#y*nX}eGN9oq7S+qO;3Dey_#EvKC3L{! zv+ofFx>@wT(dFkcN^n%YypdCL^lE9%{gr!g0xsU6OHWjes&rPDI{M$C_{|ktLXMs<@XP!xTS+?+z744I%Wl&Pyq@dpMTJA^>!) z2?9L74M?@u4lPKJWa52Qv@KGO-!A`sEdrfArD4q=nZ3C1q7OU>{roAgEn;8o`pyfM z`J@UW(kLFJnzd7f&*4|5|E_p`^_6ftZ76B!s*7r$ofb;Wlad`fU+(TU)I-s(@SBEI zT@)Pj#zMN)kh%z-*ni_x7n55AAobm#Lz6Oq7B$xeVbe!Q8{`p78nI5H(clopc83gb zw-DyFrv8P{ky49O9siEXj?yfX`5{Y9(b$5Bvs3jSg%D%b4l6c?Uqsj757YlwJKiFe zkX6g+oB6NEb=IIWnCy#!AS{t`x*zgd5{qwTd2HYWD0PE0vw-&`oc>B+jUP>XoJq0v z5fNKINNJ3TiBD7`-~WK3^9UC`l^EJF`qw&?2R*895vTozqHTO+<<98Z_%_SRVnyn| z#Z5Y}&Z=OgUNLK@Z-sGM1c$e2jegw_)btNxW9U6Qv#a7}wwp}|>N#j2V za#Wfqeadf=oFYn0M!*!%acwFV2 zJYx@UID3{xcIB2Xm-UoZdsY@ZmYE_c1sWTd&c8tP^5RU}=pU=c8VL;-+B4LaD^q1r za~;WyrsHbXgsqnjKdgNd2a%PCasL!`#6H}`WRKxRI|g`<`2uiF#I%Ab@eaMy-9Yzc zj!cN{3%|4@moGMZqzQtK<}yn-?otd8Rvda?bJ#=Zw+qc=rO}e6TJQ*7QdhJq>68j8Pt&;nAjoA z^Pt$sI&&p9`akEVvu3WFXmjQxf>8>*RqB8FiKXpIEXe-|q5z+8(O^kjV)~KKMsH`)YDTBYoH@^xOL8St;iND#H)7KX|ch7(y7Wd7s zz+leazLXvsBSq7Tr!?$jqqx0~=;nCDm({yxp?7VZ_C8Y~@?9a*wMcm1K3HLyAQ?6i z2dtQ4QL8A;bNNGoTpbN5QDA}Cw;}Q(+r;9@B6u+8l|uDms*8QjWrBHFni}8b{&Gb? zjLF|(_a3Nu(1uR1|M>``luXM4?QiU(DImxv@|Ht(Dq~JpEAP{sl!M{m5UVh{rb-;t zVt$X^C-iXXPJQ@iaHXT^GSWWK`+M1+N zX$0oyE=^qz45oPTM6s9QyqF0C+Uv5f@-3D`^~F}kjL9pm2h zDdG@F{@fI^j3UnrI&lk_J^)@B;X?>jFnIDOJRUec0A3xS-j2fWwhT=Dc}^Pf(Etv% z_N*$XNi(!;gV)_>%%BXTef%;Wi6boHUh{1^{`S6%e{~B<%jN&MX;iVC{L_uZ2>l0G zAFV&XnV{n$M9RU!O8z;BC!QgaKpYSS2{*2Oh!Hi=HBl+kV+@CsI)y>Psj6GvsAWZL zVgoAS$`Kv;@Vx5av65M%vcK+1I_&L5xpAFvJvJSa3Zn&<;*D6!FqD7 zhNMNGaT3G9ntt%gZ_Ae-vLMo`W4qv5KX{Y3mXvgb25|6O#9%6acyhqE%Il^YM~h)_ zIv&Z`nbT>{44p1bewK0wO_bWot-$v4n+OQiw|P^ntVvEfOmfoo z3zN2FZ@K)vYJN_`u_Ff}@t-6DPbtB6?<(l+d9JX;+^Ue5Fs79bu}Xxs{zy$k!n5W$ zk}|&8wl`2);^A8-{T4u*ft=mDX2u zS<&@J#?aBE5mPzS+V__WaSPUetQ%;#v}qMJiXQznBE$IeATUNt^qG`5nN@g#+LSuM zr6NBtbyX~2=CifJFNH_NwC>92BNR-%*!SXzGrR8+AiYXFutQ7|Kj^7jg`r{?t9U|Z z_$}?5yK6-yK)!I+akk4nO{N)7|h zyo~c~b#Zx#hKnLlaEXgvKZY>&1BHgh9i|_^dq?HpjM)DP`ll5rk`3J*Pn3EBhO}Fr&p!b2T3StBnL> z>1bz9)^`b?i5~IdI{%W2ZO5Pwa#GpaRVgAnpjAsX3IOg{$z!a-jL9%r;5^u%w*W30 zk+M1JuAdgtMgTGn8n);sO0a)kS62<$+4z6Rr5IG~(k#MU7cc<=>`0_UgUohVP)aL$ zt&dv@@-zN&y)h_*eY9qFRS{BYQBblGGweg}UW*SlSmt6rR1WQ&cbMKEoxYXp`8t0<-n;SSNQs4lnO?;& z);fI*>BQRie!Q}Dt+R5pW101Kcde_YN^F;9u!*i9v^LA2c&xYgqGXp2RuC;?<*iuS+ocdJeEtA=S!SS9z~)U05ayd zyv3VraaIVWiwhpnu5Py!gOstNFrFT8LqSD;@# zcGVHqBW>3KijpYF`qhQ7=;j@!z0vQ#jaw%tzQn?knsXl^22#G8ljLYLl4X1G>F)F8 zoBh$L>Ay845hA{bE+_o%v(~iT06-Duw-MFB_jBVd+PHxm96TP>qbB)2pZmCh_;)q3 z&XTAF%|dwC5EaTfXhq^X^+swBeIg`4@&^ZXHY|!rzxiG6qmrSnuWM1jWS8>zf)*U&?QI$R2+*u;kX!B zaG2J-Ba8^r*}@l-z$09M>*q-FFlI5z35Q?sD4`o4r7Y>NjfrrEV>H8hacGP10?}mo z)X(MfO+dH=Sk#2p4C6DUlbS*O>>Lb) zR!z~I!3uRKqZ|C~2Ptm=Y;+EMM-h4ydJ=^Rx1fGUj*RScw9%opl%DIfLDCoOEw1Tj zx*MxOtZ)uIISHzvC^?1?D?%NVd#&#T&}9fe(N3t3V5j$<;l_yiCJ=|Lm{L;rNP}pE zQDBwnV))^CmW!sv><95MEa)44i00an%(9ZqVv!_GR7C`(Tl^FS60k{JQqAW<1yt<# zC7{pfiqd7|g<}!Usxg1F+_q_}BaCF@+NEnsaMDvg-co;^AV@L{RmT#If;Ezs7H9gv z5@S@VD#hz%xdIX!MeD65^I|OYQ$_9*_#AsEgGA%qqbhauGpUNe3W^GtM@pS^gb;E| zi_|X}M@A%JKBpfEgz%a+?D{I0B-|{ES8TtB0%zr}>&c=U@+;nFU{yON^5J-469GTGOb41&T2?Z(n! z{!!SLjT?~8WZn1&)~D&l35}J`Ljt7!ryMQqmIok4i@M`=!(R}&5jQDO&l4nRjY^|P zP}8G`o>UWJ1P54f+fCG5eWezoVSC_NuC*~ablV6~JJ4Xtm^dx5mUDSYGztzJZ;jLv z1cYM#f(6;rLngvRQ3gIkHO@(+%s!SKhP7|Ak1Q!%Z<(uTz@EDP&NSjPaEE7o* zg?(1)8=th2BJYMb20u;lKHXijyGNNEaM^_=QId3%ZpnG0z|RV+oXhneCd`%>4LAK8 z97?=s)qE7s>W?y(>t)pPKTDbjW0gSzjlz>CqJ#XxXcl2beF;e4B$eOBIBC`sEGd45 zucqLK89)|+3)sx47`&z}@2U-_?Z)R*9Twb?pc$k@$FBatDBSjui$&9UAl!@ zBP>8FkDq!2mPDilP0M0Sf*H z0u=G@`EOv;L!ZAm&`rbShBuUpMIJL#gd0hOy>i1^heaDm9qWWhb^8V_Sj>-;v}w|T z2!SMY|0CFv4p&+YCd@>UG1%xW9+c)L2vHe7&;uzKhmtekGs(;lQQEp4GHNl3&KUGr z_MD?d8QV3b2C7O>eY9f?HYO$=UN1{4-&iG3#&1fao=MuRlGL(@`{-f%6U5O{*WQ>C;rXmIP zQ7XyG3sKSI$t1^0Yr(_z^v4t>)tG`Lp(Y_86HzCLKJexa^7}f;=<5f5ls(_KF>z!3 zj2njZ04CohOe7r*Kdr7(z(?|5FvUu#ZvRlX((>wEg+B_@kr#(8%psl*xQM7vV{&k_ zxO{&6wEE1=3R#S`m6Ju;M;@a34h#9UAgtg-jX*Yc92_glLp2qh(DW)|B1(7Sj;f=G zL;9C|SJVKlfh;H&`sz@IbC5B>0u-F=ifCzoZo|Z+6}lPeqd9}K(8#Hb-@o(uw>EhQ z$D6X$v4(JAd*k})76sOnXlROKNhB~uZ|F>A*0^!H zWq}C|F&Z9U63PEFPl+{d>UTcvt*?z?3c?42B|}CiN+KdIF;q(&;{y&W5c^XGl{L_h z9t|x|c!DL7#TUEex~h@&|Do$Wpqhxfc40aMLN8K6?;&6aEg;fsKm?>oQ9>`GG${&% z-diAa1VRU;7b&9j-jOOOy(vnwAeMjd``&xMyZ(FEnzd&pb7nG`eR9s;&)%~i*{CKg zSeyQfQ64*I-0@o-)Vqgl&}VG@HA(fVo9_2T(*(u0sZRcyjF3fO+-HBQE00j!bNi<*2+lH zm}jC(Snml=plQ|~S`*_~vlwzX>b_d7-sCx-LR_Y-kyDcdeL z#z#r?H*DcU#>Pa02zVwYqJabq6k{dk55x}MjOek}qunAQ%a|niS>^tH%Hs0EA=?9Q zoyO;X{XN>mE@~*V%6DunAsks^)u-!P#8#U9FbpEaXH+vQj5NPhVKwWucJBqi!G*g# z5ZJn|u%&jPle}G=s)gO9BLRyyd5s0wxEgWGk5?kB`IEj?#E}Pq3(seU+6ceo>DYo5~D0vIhjA5zzH+ z9|qW}g%L=gDHDx@ZfuYPHBvDZy>5tlhrZ?}2sZF!h#`(kv!*eIDz1Y!)q$Fhy?5P; zfz}2No_v@HM)`c;3S`1H>r6BiaAdYg)!c*#*E~DT9sVH7J>q2sV{SB8GF^WpGI!Q5 zJK7Qy-E>ck9|f@(paOoc7*tYkg8)mD{TF? z5I|!9AzD@T(TpvJ;X9JGR>U<^;fsE;dp+sO=7yWP7^PqbSwpEo{BNDcw>qk*@aauabz0?#=h=>2_VpWB5Jgw7{bbAoQ{>1hBH=xrUP z-L#-s?Mtj5^~J$8(~NeGq7WWCKNbo|(@gwv8*Wr;=)tPBAp19B&{tj#nOjmaTNIa? zHp;iuf2)*s$YlHayl&oV>BGGL6|%2KaFEmO_e)pi+QCP_nPfJ9U~rqTo_F_&2Z~3t zaAH86_WOb1otswaa@<>9;M-Yd8Tj4x%LdQi!*Pun4^}cZ95Q*|rOY1OKPeS_;SOQf zl&!VFP%}5cBNaBQb6g4+N47XE%=H}}s2MMQ>KQ#1ku zdVwh|?pP;M``)pOHZVPl>*d8Z3wWpzsX2su%#RMnQJxbt;QA=eYs;RJKc;ca;$?9G zRX}NyfLejq#@a0g2M`jOJ`ITpj@GapJ20U=2Fy#Wwqr+){%_mGG3m8B9Yp7Mam5$C$4}aa%cU~oTu4_-5Z?Hyy5y?`dsH< zL7)jq{ONa-BF?pJN8Jyplc4$Ex2xNAc1nlXM?aiZx>;O)H-3;H9yGvVCafsyylM~= zq`Tpi=6dlVVtgzx>si-3k1UNJYOCYVViDp3OR#8{%<1=mN8(O-!*@fgI ziSLq!vkpPY50$YMg*YR>BPV6$dSQ9>R_@J4Zjao0N7gpOGu)IMtm$#drMSId9bmGT`ocY3GfV-uYeGQYC^SBs$Df8kUnXyo9`np4LrH zSvArpp%$ZP4FcE>oTctMq93?}#g$rY4rbFEnf*W}tB=`oVCOjJJBM*vo`i{YQ4J3P zKoEJ;kn7uVG)+%--y?R+JTX1=+VhoO|CQPdNo3DS&@5ceJ-bk5b%uS{mD;CenwWG5 zd)FS4Bg;VRntxTnw%@?daXt!K9>Z~?CD-c}+rKF7Z6W|~Q8r|m?&Eip|D00FJcosc~F5E&o%l+k7Zu6sx8 z8_~@OMe@Y%%r#5HIJFUk%J^z6I%Lsv$US>cX8dcxDdb1Qwmd4JzreFbzuqBUP>c}< zu#Vg;CD|B8sca12Tc1tcQxPsJW99!(KhQBF!oQR41D-~fVF@uarc#l-KeOkb!eLQp z(7!&Q-pF9+;>4N_oH_v}mYy_AVT62fhf7Y-qi>_COAEauy|e7JstN8IWF#~Dm+Z&} za}m*Rv++gYG^A0V`4$HOk|2`&zTU5gY-Q5uR%MpX&^zyx0kDae6B^Qyo# zc6L=EQB1UsARB#BYRm9|X*B=u{?;|FY58|Gp0-bjd)Z=yk%|KwfD`R$8_jDxqN!1` z4fFOGe^{C|-N->q>0H8`Fl?dG%g4ZiZH$f76oBzL^3tl$h}^!_E~{hE>0*wVxjl(pc^06*BYt33r(%mGWkNDZEY&>YT!yB{XCZ&1w!Z`d(6oJY^ zzzc2~g3NrGztnN40=~teM6C`=@lM^M)TP=STZM?(0)GO=5yMcBlTjaO$ zVrcz?JXPCoMCj$K(2)o~1_&J)QN*eN5fF_WmC9Ak(#+6$l1M=w7%3V=p{HU&q;?7h zIs;vHJJ1KGtnBU(8~)+o8-G-)a4dIt>7}~oQjdHp70%w55@=}D1JuJAi!0`j9}Ui zM>!Y0seb$t{B;s6&7tpVh*}C59Q2VbXgEovF2BZ;sX@|=>Lt3_y-EhqP<7s|^d&3m z(V!GUz_DR*5Pb)rVkVAQO^; zX9t8@7&A>{pjF^=f+nu38+F3ZvW1eBAh-pETzCq5-UV%Wnz)~EbM%#@(WUCWCW;rV z3%h4aNn$hDx`s4C0kta8?4|uT?NwFMR(W{FBkAZ`S(tzl|7nRu)(qF)!bEAl5ufpX zl4<24E4Cxr(ik~&)d+6H8!W?KHR2yG8@_pgV8q~V$fodo=m|k8rJH<27uoxa)a^0| z>7Z8U*j~NY399!=<;M$7n_`ft!%SQ%D265>%yzNUEhD0i=2o~HL4hfS20MID;F~}l+6%k+|j-N z_)c22B+>W2`?jPUrKTcWw;9{Hwo#Z8cW4cRSp5NkJg8}w4VtHv9 zYEt1zG?lBUpVfJjY#jWaY9(_($xKhUecEO4R)C592|ovM>6{o=T}U9F*OC31;c|wr z1(1s;OSze-BWQtAI^|Izkx%C_2C?w;4iXVFmoPEFQq{Rga(Nxo9#;OM{P}_-eLQIv z>2sP;rP0-d{=5wP)r7~;tQgYP+<~Rukj;X-raeR|Z@|7Bfo5#6O1k&(KV;i_s*4V>Y8$<3Wbk+8nrO_utRkz>X6 z_&fjiUt_!gI*m&22yi{cdQXXGO;Jc!wzDpUt@(=Oq zj;ag6d5lexv#Q?Q*z$%%@glp?KTctJ~B=A)};_Zt^#V!j&p#+7;HNm-Sy_ zG-GAyKeQSaK9=ar%`F9pj3=!8k{a`Y@(RIsRtm=L`=$q*b4#UZc&&p!(989kI=Lh3 zzZ`Xad=SC@qHabdY^>ybv9R=cwG6A+6SlD6Ld^OP^=IObiTXE-)$BV3RR+0OIQDag zL&4IJh45b92zP!~pXZGxN2f%)X5Y{$AZ^ECI?84eAm-g<&F?kDeeQ4)87r)z$iE4q zza2YVMj!ie4MW%;lj8>K00#n<|2_X9{phTU%l997lfF+rC70er3w+acP$6cg;ZVhF zq>hwfwc7lZ2&geHXEbGKY@($B5&|R>!*iJ=U&C2xL=H#Jc+&W;mXHsBdOL5H7Q1T! z2X;J3XHQGOhacM>27D4V>mq!48)>;IcS68R&{Mw2BpVK3r91UJuL!m}@lW6#V62KB z+($&9yzo~Q{(FM_ufieiBzcG<##mn?R==nUPFTh#eO@aWLknIvdG|cx_d{fo?lm9~ zkT6J7me>tS+M0_BH0!f|j(Oalm(q6X9CBT#H%jJe%2kb5&w zX)HdD>6U|wN)-jMHX{W)P*Ns&P)a%s4-%91-%FRy?o%b(p5+wvb05Z}#!EA)YvPB0 zW-w#>l=)KolAhe;iqYRl&2+hMj(iuSW<){RIU({%wuFvN%k5nv5mWqp6kbFsUf<9m zo{y0!sz@Z%PI(4hYDzbkz{+p9WO(y^%IgnPj;Yy7yEologjQ;Cl18HQui-^n zCls$WMF$UN2|4HWoNw1)V%m$dC6RsuNmDoJ<`XQ!J=^n1KF-P{9u9zA;+O|Iv_zLf z!(`&M>1bYQH`DMFd)-XrZG||+qntXU!@at6ZlX6qjJIWG_Y@-I zBL4saQ1j%H4}RmDa0qcgC?lS6=ZvT5?~-dRi9FlW7C7Udy`UfYrQ;B?zkhE#>NHfv zT7s0f^Bkr5-HxEu)U;PfBuWkI0+IXD{gm9!YoJ5>$jw@y*W4c9PFTfXxg}mfqi}Bb>~xvcG4@?2>a!+j zui0kctjcO_bj&S|HM8+&!jqzdG0G$~+Pz+F)&Tqz!^j4ihW2)Eko*VvHL&&UrA*ei z-~p<5TDy~cnHG;d?ICilIt=Dy*A(h$#Q<|xB~ftX3paf&&*#y%uSlD>9()C9@xldQ zF%-6WXxn^RqXF4IAkW1g4W|sl0?s+wfvALzRblozOY4FTKoLbTmcTjmGU-Q`iX>0m z`SWJ(57FXJw?WVtL(*jtF2Z(^fh8M-BL3im7jD$M@pgmjOX@;-?gF#d8u~Fi-tuuD zs1``rB{atk#kIi-(lj}gEk=sH-s?9v{aM*!&(YvA!E8}z&JjDM)=$2#k#WNMijG%G z&$ew&n&tB6-Qg2JJKKW1M=l?YRAYpfsagXVs zkDDllUsB#$0)fQ##er#Dn9=K=L=jtTkSPH22XgArq}qJJbjfXyTA9u7#co7j*I8iQ znG6YjNqp&^R-hC^lQ1PUGZ`WNHd9O=z(?@ERW9*gDlh$is=V%`H{|za`yj(%1cc~J z=;q-nisI2L&PN}4R~~Ja0M#)velX6f_;bG;O9DSTF{KLr34EW z{L&ow&65S^tQ9>`Jg38`V}OJdHGo?c?=2Gf0i|U37!pc9zh$dR6iQ6x(PL*ghRmlx zGZ5HK5d@MA`=}HUo`UJ3w@|D6Qc+zoo^G)MD|h-t|1qKh!4g|70z1(9hBw0jz`-j@ zAXP6;Qd7(vACGdt_uou3AAb6(E?V1|SOz!CGR|BR*#pARl#}yJKG=1T^+6QM=S<{} zJJFCGqV$~%9HfL#a~PM$bsy~Rn-KmnL_#P&ZahgPRM|7>Ajqs-VC`p6i(*V8xbO8v zHG!QUNmoqPbvi> zrisOBX1p;o;{iZ&%78<$!HVH^50-~3hRPn5C1%)Hndt{4Y~fsz3V0Lu=6wCCJ6d5F z5S1~*?=2aALFQ|ve1cKA4I-k#%pyQy%f(f83n>Z;)71?Lo5j+slWM;Y?TTO`z7^KW zN=92_fp6A+Y5AnTC-)aU{3DvZp@nO1h9!y965~wdjEKTwR|)tNlTv$vi21XUQdMg# zp5w5hiTX|s2w@;!rFVG0f2-w)gWl|11;yvx#Y_lI`h#CF)CXP~T%ipwrBx64srkI^ ziEw2I&n7L@z|G3o+2=Xo({`lmN)YHfKS@3Ez%M}t{epFJKo@_LN!WDa`ZeL2evQ0X z%%fJPyo<`cWpnZi1raOb9d6C?(R7qvrKW;(Z`i}F%?=gU7i`0=kDOzO%GznllB~>_ zQ89*DA_J{`#xtYi%BH_N%6{H{b3lpvR+hkRu=sA5yGaJ$&yArM$7KkNFBSuz(4;WKi<&#{W5SOh?>_GA6o0UHiPQVu-7h2J4>LeKIlJn562)7ZkT;P})|eDZbH+ z$g8|uGGR|-SPuwnV9_I=Ki#f#z*L*vS5gp<<7&Kvoqcc2EbweIBjf~%{p}#O+opQoHum~gKa;VBHG7vxzI-~{k^qt|dN-fsdK-y4wOP%sCeo z;pTL8D$9jRm4=c4KeM3~g<4RhTBNvR$q=6I&=b`kI!m9Z4sf-+!;dmX|1jJIt%PS3 zXJpr6k?|T_O!S97--P3RskoJZEj10j<^35MH9-S1O`=nZukugVB^C$il+}VKXBhs= z6wofZitYm14%FxcAosA-)KEp>FjwVhi)4R_VWCemNtQqhu^@(6J*cfymWZU+4}h-X zHC{&5a4|B0n~YY}V}P4~n#h|q1YGzraN+;52i~|L0pHF-Yry-;-HVK;tj`G8B|_gg z?>0m%u}nN$&Q}Zi5wYc&ogyLm*i<>q3#8lSrXG2A)#$1&&7sD8Tn3&2bb_eB|k|CR008SyJ)wyU%QFp%WQDm0mv}rQSA>s`fu;U_yrU)AysINiV zk#?~`x{Tx-&?q_6Zo?4CQDZ?ecm-6|$KtMlDm1+a6{zQ`;jOEN4ga&Dz#tzZOHTbT zPE+U#uM$bnun_3wGh%Ud!aA|UHFdk(`&^OK9ZFzhTJC_XuYsz`6ZV9%W6Eyobob(J z<^qBt0N~1&w~WtG-+0je4gY_pF;~JZ!ReIoil&bAeeNn_(n&vjXG;tKE2+-hj5mYSJGtE7XRWo%RrLSXw z-CDK^54PEGXe2XoqGNEn2D>F6*4=HBQJ$|7s`Wxm7sy5hGIXQDMgC=@qHmaqMz(Q& zWcmi@a7QEuK->{(`^hqFc=5OQnQ9D!G4#dGg522F>QSVfw`nFlQGjU{y=B5kQMM;C zLnM4(V;=e{r3N~_6yalHZV$%+-rIb>Wt^D#$u2DP!5{7HAK0u7}4u?rAFi5b@1LW8M)rtOyIL{y&G+yUOL3LzvTynG zqV#0n3UeIdOl@m-64Od>tKn((I7rF18IGtzqf1KTcZWntDMbgoq}fb{6;xJV#3WLt zA{s?n)-6J+CHg`{x3TCWvjI9qfUpCxMS)3w>^L}M#*EJ2;)+{sIgfn+?DG>XWUy)1 zzYvp3ZnZr$RLH>;8&fcY&VfTYltQ$?dHSR+cGOy0WpHSek!U`O*Mt)9J<3-v!Cg*o zk@HC7mtmBlH*u9(tSgBLZ)CZlmmyBAOI4rWP+~@Dffv_LKuK@M5|%+>YL7`PG^E?( zQ)K;Fc^EVVw-@cja;k``=?K&_;iU(vBW#3mkjQTG0fsO3qH4O-MNGWA^cL}kGD2*W z5uU|cNX~$6Tk+l#Sh!{6@oKMSBT!WBxLi{Ygiw#(SfRQBs(?H*0+GgRi-c!TXipPmQ1Ev5pdy!iCyiO7 zn{LQbsbms0f>Uh>8ktfZLw!;BZ4!DRkVPyeRZT%gsGYLRYj>L^ztUZHTrMxlNA~Rv zj>Ce-#`x{Tbo>0(@br>=$j)|Ves4JA*STy_TR}A)F%wZW*B8|^3Ed01IlR#KttCK4!oo!I00zG=UD2 zJGo5R@OQinE|E%FX&K3QEyEI6NnJCEHzjAw>TP4{E%TI!@)AuP6MdOVEU0opKnB~;M)w^p z2@2X$3aa?^1HtnB*13ulULPjfQi5WJv?z+_IG%>oT05(H(`E(&VMJJZT%x{%1D`M> zC`V_Q1Vx4*Faou!Mat;WDe9Rwh%Z4cL7|K}{Xi16kQ5>(eI!y}$bmr+lg^scKP+G% zB#DT_>WU$tHKCo4>|Nk@V%v^md*xdS-h_hjqfiwEB6=gr9JR==`gH3${te=+FiTKW zldvq6Qs!v`F2&}!Au&ZT$k#Z`PK{zNGWKKMfAWlV|K%AQ)jg=RlBIg{AlqJcTwJgup-M?7(? z)`;ThDK@5zrF_Xo1zi*1=K($j!iBvJOwna<3`_wZu)|atq}(HN;FF~BVoIhreihR; z&$E`9d+-UX_KjbL?&3nO<$l@8*x@z4u0o;~h1HQL-=-snPQSLfpRs};z)eH54NtwO zw$f>j>Y?=SrYFtEdU|H=Otx?Bi?-vw&TC%GCOdeJ6;db47?azs*$#<%je7$D;l0Z|G$2(fB z{eg;?(@KpwX~({z^q+5hNr_*W_Wf(?Uk8#vsUj5&G1oW!Qa!8gc)xQON+H^meW$Q2 zUa%cG8+`eii7sowjt%O>n#@R@to+vNk%>A64rC2G=6#7FNJPE$Pk*LhUp+=Z4Zw&r zk9pV@HDNDvxfjQHaaM?<-x`DJ07<$^Q5l3^h%#q_J^CZY5VrdM;z=O^^=+2`tv*I} zAiekZY-}Ibn%wo!@Abw>>RG%rE}*>_>ZpFVTl^633YW-|Go;++nodM81KV_HbRR~` zkfJffwRFRoyAe2_HzW-u93*##Rx=BT>4V6xzWX?xTLu>^2?m{& zMJwD<@2cX}FCwOJR6hK!fhikxg7IibEU`?{=8aSW@L+NYI%FO`c0Ytn1%m9hQPURmA$b%l^F=|8}C+qdK>8v3{K&~)?xZxdG!-2KhgG7f{ zg_1PQna5x5@T<)C_qda5WGW1$~8f(2Z|`a0lmsy1KGkgxPY+wja$sg|Lvr>TE2ZyJ1b zGdW+jxO^z71pUxTE7tH*WIlOPfcd_o-G7hnrFF7rUswbcLxQ5tCk2!ay6P@mM@$sr zk?mI&-JRSUb9<=pxxgda-y`%jr73qOKN`E5k{$PNJpxLNs@U0X-mRohrI`;`4}0Bn z5ha5#QpxgGQ}rU=`lUaOn5cKj#Ar&vn6R>b$I-$DnIuW@@tG?~J(HP}R=+)_rW zkWanHs8}wEpPA@F0?W~r z+~2+DJGKdj(e!QB!;&)w8XETt20UQ^Lwr?QxsN>i`2g_)v1ByHODBr%_(5F&(_w#r z%N+ZKNYTg*^Qp}Ml@Nm1=S2fq({}DIk{W5{I(-vnLWa--9SC!F#)A8f_ndU&BbLPH zB@iO@hyWg|{X`X03q3nezq$xCx6{%9;c1#d&2E^av_J^jfI!MIyxG>g@l zD&5L++F_Ku^`33W6FC^K&LDVe3xQl8shBc@^lc)kldFtpb;nthIG3j?^(UG8>v=>R zU9442h>I=h9+To@N1Rl2f&`lV>823}^$&TNCLAD5gJu}PlR^iY`4ibm^JtyIaaRiG z1w_gC%eA>{DQlw8!s+zHP_{I6bd^DK%nQfnjl7pex-9)N8+IAYe|2{Y|4h66jGUkR zfqns7kBj+S8xVxNU99FbLOV^95grj%(8D(CW27VdF)<=7df}p>s4RD52A1L!z{6KK zLgmQ&Tz~=tno7nwa+dW;s((>E8S_V3V*jc3Aji)93br zQ-E||$z86AW0z>{KjRr)R$ObVDRaQ`{z^Xlto>4vrf&j-F51jvYa!q^F!%uN%nKOb0_x2qIL zB0L-O411_Mv^nhX!BqY(nH(}NW()ejOR)6^yOlLoymnOR8KKW(&+3RfH}enIO~{>} zhHpI=HvwhdfaLe}$wTtjdQN1nH45;`dFIBmesASh}IqA>q<|idz}#LUG*UqoZ#?6r_^B@{tChna7x&I^#cqd z9Ncnz*_-BX53z(KM0)Ewv*K=!bo5q|X|=!)DT(P_rQoF|4DWA%_X~V&{aGoT(+aj$ ze%Pt$7CO*ooHk58QrDgK1ar(!4Plht&}MX17@!?2@QN-m2C6Rc?2`d{>=YbRe}Z}e z#%SD!S2VAi3>8F{F}FkBNkE?%uJ?08W1LA<`y-<2xct;j zwATlti$!ww$SD@wX$;Ohb0hjH;i!Ucm|%M9RHiIvO2-FZ-048mqj)#gRm}Ra)Qy~q zq8@K!C0AIU2E**|YxCYj$`U0>^g|j0pZ`3$?Ws@F#1p*-pLg?t<(ZClp% zCZXzCYAQy2YzHrK?S6KGI<6mlbe$Z;Ct8Rbz`eTI&L@1#Xc|b7E9|J}+aS}S$aG-$ z+_%9|L6l?VxuB_d)lZdbOXK;p6)xSIIQL54+CU5AA>yjOv=#BHm}2T%xT$We8*OQ> z;5@8qX!cfD#)SFh7_++ej;qIvu~gRfjX5n7cHm{MGI=IrC*>9sB~egaQ0?iiy&wIO zZQB`J!4y15p!#%Gc1ZYgGCyWZO0jV6Bxe)KJrBxZv)Jdky$=D%|@ z$88u6O-fE=GTH4)4HFovXiG)w5UXr`QL_4x>{SFUu~|9r_^mXORZyB&BCCYq)2;sG z@fY*!mWS9f$D<@|hu5}T)nLCvp(q2W-i`Jugoom#*cj8AYEF|uZJ~py)@4~yvw+fc zOV9a1o$r2v`N&ju(2k->&Zp_y-Pg;anu?))J-u>ic2^xhs0xw0wWak@hP)yWInjeQ zc^!JMTHk43m@g$HXDH%*uD0lh;RGYs_M zt$6D~%Pr9jzN+Va5?c98WjJ%^)G#aI`uG6vXf^m-R)og041-ZS)ceun9hEgxwvfh~ zsf~giOYAmW@xBeF9ZQI3rfi?))2cH~f_VTXyXktQlyU(@?-&;pVO3jUZ_&C(nV7fg zGv$6L=XISHa^s0Kx6HTp2L{!!9Or9^%w^5>H>(lbME74eDixReztet1-PC`_j$1+O z8I#Ff1@k~L84_96&q2|9QebWo@n(VRV==FT61q12=@(R!K_k+vtuS@~M8LJ36jOD9 z%TnhY4x8LAXGbKWO8ALE83CB<4wa*`q7n|Qvjjhe@*4h~K>-m)E`+ezjsdRZd-|`5Ak`=JDY@WlPB5w_hn|Qhz>my%$C*Z_Gl*_zxMPy-~NQ(seK9o?!I8e2`Noe90`H)v-K963kKTOf6x$4O9BFanrw!m6igh`iRP5OC zy4T6Q?se}C=v8YYR{Qi-qeg%I*Ej*S`a0PxtBI7Z!!=g}65M2m0a zb(7*NFb<7R{21TVmMk_;JvOE#a;#BIKO=wKyVRw4WF^dRTn zn20UR^M}iv!0fVo^Ga~$SFBh$(T_f;HO`r~7R-2;TOLUoB4renF3w`0Q>&oMV=nKw zmLa~8Dty*Sl#6>L60L4@Uo8HorD3F~%)>fT(q7R6v{54S09+(mQxXiIJggcgADZc- zhmEwhu}o?7&c9B?+Y5i?L00kce_ly|FrL4DZDIT29~|F){NA+9r8Ob`qU630)qPCx zpTDeMrE03Wb{76fzkruRxsGb4P#3}t1B##XK!5F!x{uWrWMM8I7j_5<>F{e1gM04wGg zIdO#K4tUj)Mr<6=1|fkON1l5h+KR9wIm-NzoJt|$?asJ3UM6=Qn+GofXJz8%PjYohp+I{W3 znMZ%uMPB4NjgfmVGtfPO_OW?Q{9I`60w-FUv9`Q`JMe=8PA|GhwP3&f7ZkEYW{CMP zm5x!o9B6^tj%~e_p(mKXy`eWmIQ7jzMyIUwX3cRNawav~g!>8z;+PFT*9CUKwDIQUn zL&B0?U#a}1bO(OMoIR$D*GBDC)BQcw%BDSRlrRG5NI>UkmM+z6PCKWnII6li_c?tp zLy#}}s9Dj#=LRs2h^IWf(tbXzV%lt2J1d{zb=TDb`?O%^yW-IpR2uupD{pMbMouMq z=O9Yh$EIf$XOQbBTt?g^4I0+zDh+&UtiS^d2CcDB{>NH~+qcpJZhuXi)IteAv;Tou zi#=prUH`#Obt`rj<8dYZJ%Vb)YnRlzO1HeO#k|&ET+OeD&%@D-v8AKm+|CNVa_#yR(AzOVkmyr(iT20~OWZAq|{H9ShO>YL@{2FJHN8|Wr z6pSTS7-f>b(cXS#C&#z>Y`FTY*+5fmxXFAku=4rdOjHFTG1PrFPSXdbmh3`bg<mas=8awY2%Y@Pbp(*`O+;F}Uvr-4(zH1{|hQvG(4PTk6iS>>?cYONO z@d=QhJAQOnTBD-5C&#(TCkAyg|L_KI^CZ1wmhqFp0xi%zByv zXC{!i^S43=CZ+bXpy=zTiA6%+$2Iu0TG6pUgwlc!NV1QPjnqKg3wBfs`dWAZFTQhY zNcJZ71Gud;pQCY+Qq4`>T_?ju?(OvzImP??_1Ea==ttVZS;+w3bdZRMFbgLY>!$L6 ztlvrH0n3#j(|F8tNQqI47kCy%NO*huW$5r|8Lm&~+Fd~@rB>5drEHH4uXA5Q?<3bq z!oCvll8{XB%FtyN3*4eFjqWLL!Z;*Ni^Y97#<^A`V@(^06LbqpB_F3DbRu745hZqp z1#ZEJ+h4JjQ|}cyu`54(3rB-s8i$zN2K0trf^9D!o>VO}NMR0tCA;=3cw6>f>yhu5zbb+kk)Lj7cWuF+gH zkpGcSR>7!Gnhrdsc*C1F`1D8nK0yveP=-{oH%UPx2Gx4oD1GMkMLI3YQk47oD{LbX z2aTM{tR9>u#u=&Dx5Y*?Ey~C zbqgUX>vhL;<#a9B^a0HP1k<>m+fTu+L!~A@@HwsC80wo;$|jwtYcT_1k6l$~UQguV z2`KQjna}0-RG(91AK|GX>tf>2n?=b_%U~Kc$LnQi$qJkLyTX?hvnRsPhUtH)$2WR> zi2>cMMI6xR%h}S3v8_O)To8~aPPdv044*$k1s^9eR0CaAiolcm}h z@I<5VU3Py1 z+Oix=3ir>S5l6IHt}m~a1H8sHs}j+?0PAlGYxzk}nxsGHr;Uf(#8c>@Zn!?h-PIwj z9c5Q_)JKRdt5Xa9;LQ&(HoSX)u{d~eo=57XO@b%==ouPKD6LquK|oDTp(b|MxiGJC zDmt6I^u7EuL2L7`PN#3aM_nHxt=36URUUYq_STrv*YvqL_!_FlLB=|I1EH9OZiDaV z{(Yv`Vl6x5C}k}><>&)!m03#6dxnK>wj(8$ADem#{l##x#8#|_Y;KujYUc!$#~=Ox zt6u*yRdFU4pVCKkvao)WnyO#<;*%ejKD+jhCbvn=r;7_8rsMy#Czk{{J!}2qfBe&> zWFZE9?MUj=-q%b2uTy50@BX?j4Yag3VgAT2jCLjknV)}Yqx!Wig*&1CQTZn9+E?L( zsbAL}CO`j`J}&+{`CAI|H|PlS^@jhRvhDb`f2IgN$f)*CjDy5H1~ECJ9bzm|dS;bchjszBJpXXm$J& zbHL7rH~8&wIe7Dq9wz_n=J>H&XVz1;x{YanM(JsZ{NC?EPqGE8rhsKW^Hax z$yWg&frk|;HKYF|1p0zCZC$g$i=uE%#F5h8q zOJ>Joj|7h{M5uFVd~ChEh+7}C(NV{O6UM&IMri8CQ%4QyKxeL)9WPd{m<=zBD*)6@^)4D3`N3uBP9KPCMejH`(8Bau-?&3s8cnI> z%DjlCKqMgKk++#&{s8zaAY)aJh8C7K`Kf=+^uF6!yPgpCu`cH(kf%)v{5#ebA0GU`zV*?#YCs zPQe`p4M3YtV~Ls8yfd!=ZSK35oF_%H&I@9KF)+*@;#Y2zHBC~Bb~D}XR=}Tv;I|r` z26E{<0VZbYt*LQV+j6I*&Sq9_7HyIqC^QSBZ`rZbJL+s5(7MkiFqKL|PcKWZ>Cw(t z9lW^m;JigIKuh)?#PHv^^j7_UU~2XMOCtl!81S)~@n!AJhMC3B>CQUgu@re*SDFm) z{Vy~Ea1~3nlyl7aT;8AL{c6;2tkdX034UEcJQp`NZ24kYnDn}pa%vbvZ}U@5;&pSe zAbHkdo5>WQ#(A&6%7%eZ)w5(yriAF%qtB7Z+nTLEpb43fvH!;ETro7sbuBI<^pF1s z46(^_-+Ly_US8(Q5<5q5DK8NIVCQap0G(A@>0ZP{^Izb8g3`_p9uSZS0_ zoUle?0LVUiM-rUUaM~vKv&`cIb9I7E%Ma@a_{7`tYsvF8`K_@7`Q{}-K}hdZxkEvcf>~lTSEu@3ivBt%sVEhG zn8o3Aeh?d<$#p~Lx3VALG&C?R8@6q@a-~>e{9u*uxjIY0D$w&N2SXE9abB6vvDGx( zH;P!hA0BW7N&+Q0{}<*Q^S>bI!%ceABPBl-$I!J|xl=onzIC#_bI-Tq_VSN^FR_yn z%@$qnk1XzW+3+Q=xPe^jJD@S}_nZ_)>Ovhldx#0UKU`*!<6c#XW5C64oBC@1aD@qy z)Kj^UJ;-^DbO_w~XRf!b0wX@Su&K0_+&E9L<*spxV5j2S2hxA7?j zD&>O82@vpq$$a}q1>^Rz)KBlQA>__IhqL+L-UF%Bt6WTEK4I7Abu`K(*{yQb8R2fR z4`d;QW45CZymvo&t#ycW-Ypfe>!Y-b_u?{A84nX$xu#rvL`2TwO z1>hi&+oncF34r;@2?dhfr-CAzKN-)IGgy(xli-Gb{N=wPeWIX_mf)K#9WhIf4vROsIVGtZHAqSV0k(PS-Hi|SuL5uRbnd|>o#A#3=6U>Rx(1-q`JYx1_^_~u~T2cckn@6 zV{0wCdXj~=)%D)1>NnwxH{!==Zj~*_XKhNc;DH6AsW*13>QPc{GyeTpvEYfG0ng3yVX8{n_r&Y z0RmR#h^b_rUp;hp&oK$i-ygcwghlHz$c&O}42ur|YYdPL!&$F07g0$8Qnsd!KxC<# zo-_k<)@a;E!2ts;ENw&KI3O$}VFnpgDh}sQzHG3dI=d5&hgC|B#FT*kI(agJ!Y8pZ=Emo4vU%qxPr?@Qw_+ z#|%P0&s&cDd{>Zc3JoDs3Rj0bRTSJ2U@A>+eb`N%f1)cG@qFWdfz#t#!ofn(2}r^) wYR{fqiJ}!^s0fsDb5>QtiVp~h8e$}lciUg906M?<)}8bW+^<$AZ(sL+01Ja51poj5 delta 120278 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

    w+CciDf1+M&ni4KlUitAPXUABp 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