From 12aa3ccfaf3d3fce1180fcc03caf2cf5e46c65ba Mon Sep 17 00:00:00 2001 From: Jack <113976590+bibblobcode@users.noreply.github.com> Date: Fri, 14 Apr 2023 09:52:42 +0100 Subject: [PATCH 01/27] CLDC-1975 format money amounts with currency and 2 decimals (#1525) * Allow interruption screens to format money values * Remove formatting from saleslog method * Use money flag * Use pre exhisting method to format values * Update config/locales/en.yml Co-authored-by: Arthur Campbell <51094020+arfacamble@users.noreply.github.com> --------- Co-authored-by: Arthur Campbell <51094020+arfacamble@users.noreply.github.com> --- .../lettings/pages/max_rent_value_check.rb | 12 ++- .../lettings/pages/min_rent_value_check.rb | 10 ++- .../lettings/pages/net_income_value_check.rb | 12 ++- .../pages/discounted_sale_value_check.rb | 16 +++- .../shared_ownership_deposit_value_check.rb | 4 +- app/models/log.rb | 5 ++ app/models/sales_log.rb | 7 +- config/locales/en.yml | 14 ++-- .../interruption_screen_helper_spec.rb | 73 ++++++++++++++++--- .../pages/max_rent_value_check_spec.rb | 37 ++++++++++ .../pages/min_rent_value_check_spec.rb | 48 ++++++++++++ .../pages/net_income_value_check_spec.rb | 40 ++++++++++ .../pages/about_price_value_check_spec.rb | 54 ++++++++++++++ .../pages/discounted_sale_value_check_spec.rb | 4 +- ...ared_ownership_deposit_value_check_spec.rb | 8 +- spec/models/sales_log_spec.rb | 2 +- .../lettings_logs_import_service_spec.rb | 10 +-- 17 files changed, 304 insertions(+), 52 deletions(-) create mode 100644 spec/models/form/lettings/pages/max_rent_value_check_spec.rb create mode 100644 spec/models/form/lettings/pages/min_rent_value_check_spec.rb create mode 100644 spec/models/form/lettings/pages/net_income_value_check_spec.rb create mode 100644 spec/models/form/sales/pages/about_price_value_check_spec.rb diff --git a/app/models/form/lettings/pages/max_rent_value_check.rb b/app/models/form/lettings/pages/max_rent_value_check.rb index 59b2d14fe..8ae9b7d9c 100644 --- a/app/models/form/lettings/pages/max_rent_value_check.rb +++ b/app/models/form/lettings/pages/max_rent_value_check.rb @@ -5,14 +5,20 @@ class Form::Lettings::Pages::MaxRentValueCheck < ::Form::Page @depends_on = [{ "rent_in_soft_max_range?" => true }] @title_text = { "translation" => "soft_validations.rent.outside_range_title", - "arguments" => [{ "key" => "brent", "label" => true, "i18n_template" => "brent" }], + "arguments" => [ + { + "key" => "brent", + "label" => true, + "i18n_template" => "brent", + }, + ], } @informative_text = { "translation" => "soft_validations.rent.max_hint_text", "arguments" => [ { - "key" => "soft_max_for_period", - "label" => false, + "key" => "field_formatted_as_currency", + "arguments_for_key" => "soft_max_for_period", "i18n_template" => "soft_max_for_period", }, ], diff --git a/app/models/form/lettings/pages/min_rent_value_check.rb b/app/models/form/lettings/pages/min_rent_value_check.rb index ed5ede781..eda8819ee 100644 --- a/app/models/form/lettings/pages/min_rent_value_check.rb +++ b/app/models/form/lettings/pages/min_rent_value_check.rb @@ -5,14 +5,18 @@ class Form::Lettings::Pages::MinRentValueCheck < ::Form::Page @depends_on = [{ "rent_in_soft_min_range?" => true }] @title_text = { "translation" => "soft_validations.rent.outside_range_title", - "arguments" => [{ "key" => "brent", "label" => true, "i18n_template" => "brent" }], + "arguments" => [{ + "key" => "brent", + "label" => true, + "i18n_template" => "brent", + }], } @informative_text = { "translation" => "soft_validations.rent.min_hint_text", "arguments" => [ { - "key" => "soft_min_for_period", - "label" => false, + "key" => "field_formatted_as_currency", + "arguments_for_key" => "soft_min_for_period", "i18n_template" => "soft_min_for_period", }, ], diff --git a/app/models/form/lettings/pages/net_income_value_check.rb b/app/models/form/lettings/pages/net_income_value_check.rb index 9a9c1061f..0569b86e9 100644 --- a/app/models/form/lettings/pages/net_income_value_check.rb +++ b/app/models/form/lettings/pages/net_income_value_check.rb @@ -7,8 +7,16 @@ class Form::Lettings::Pages::NetIncomeValueCheck < ::Form::Page @informative_text = { "translation" => "soft_validations.net_income.hint_text", "arguments" => [ - { "key" => "ecstat1", "label" => true, "i18n_template" => "ecstat1" }, - { "key" => "earnings", "label" => true, "i18n_template" => "earnings" }, + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "ecstat1", + "i18n_template" => "ecstat1", + }, + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "earnings", + "i18n_template" => "earnings", + }, ], } end diff --git a/app/models/form/sales/pages/discounted_sale_value_check.rb b/app/models/form/sales/pages/discounted_sale_value_check.rb index 8ff48a0bd..3c1b010f2 100644 --- a/app/models/form/sales/pages/discounted_sale_value_check.rb +++ b/app/models/form/sales/pages/discounted_sale_value_check.rb @@ -4,11 +4,23 @@ class Form::Sales::Pages::DiscountedSaleValueCheck < ::Form::Page @depends_on = depends_on @title_text = { "translation" => "soft_validations.discounted_sale_value.title_text", - "arguments" => [{ "key" => "value_with_discount", "label" => false, "i18n_template" => "value_with_discount" }], + "arguments" => [ + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "value_with_discount", + "i18n_template" => "value_with_discount", + }, + ], } @informative_text = { "translation" => "soft_validations.discounted_sale_value.informative_text", - "arguments" => [{ "key" => "mortgage_deposit_and_grant_total", "label" => false, "i18n_template" => "mortgage_deposit_and_grant_total" }], + "arguments" => [ + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "mortgage_deposit_and_grant_total", + "i18n_template" => "mortgage_deposit_and_grant_total", + }, + ], } @person_index = person_index @depends_on = [ diff --git a/app/models/form/sales/pages/shared_ownership_deposit_value_check.rb b/app/models/form/sales/pages/shared_ownership_deposit_value_check.rb index be2126482..4730248ed 100644 --- a/app/models/form/sales/pages/shared_ownership_deposit_value_check.rb +++ b/app/models/form/sales/pages/shared_ownership_deposit_value_check.rb @@ -11,8 +11,8 @@ class Form::Sales::Pages::SharedOwnershipDepositValueCheck < ::Form::Page "translation" => "soft_validations.shared_ownership_deposit.title_text", "arguments" => [ { - "key" => "expected_shared_ownership_deposit_value", - "label" => false, + "key" => "field_formatted_as_currency", + "arguments_for_key" => "expected_shared_ownership_deposit_value", "i18n_template" => "expected_shared_ownership_deposit_value", }, ], diff --git a/app/models/log.rb b/app/models/log.rb index 6a36b948d..96896bf3d 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -126,6 +126,11 @@ class Log < ApplicationRecord end end + def field_formatted_as_currency(field_name) + field_value = public_send(field_name) + format_as_currency(field_value) + end + private def plural_gender_for_person(person_num) diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index 38beb850f..a47edea0f 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -216,7 +216,7 @@ class SalesLog < Log def expected_shared_ownership_deposit_value return unless value && equity - format_as_currency(value * equity / 100) + value * equity / 100 end def process_postcode(postcode, postcode_known_key, la_inferred_key, la_key) @@ -323,11 +323,6 @@ class SalesLog < Log format_as_currency(soft_min) end - def field_formatted_as_currency(field_name) - field_value = public_send(field_name) - format_as_currency(field_value) - end - def should_process_uprn_change? uprn_changed? && saledate && saledate.year >= 2023 end diff --git a/config/locales/en.yml b/config/locales/en.yml index e223c7fc9..dc36f5f64 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -283,7 +283,7 @@ en: general_needs: "Enter a value for the support charge between £0 and £60 per week if the landlord is a local authority and it is a general needs letting" supported_housing: "Enter a value for the support charge between £0 and £120 per week if the landlord is a local authority and it is a supported housing letting" ecstat: - over_hard_max: "Net income of £%{hard_max} per week is too high for given the tenant’s working situation" + over_hard_max: "Net income of %{hard_max} per week is too high given the tenant’s working situation" brent: below_hard_min: "Rent is below the absolute minimum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms" above_hard_max: "Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms" @@ -314,7 +314,7 @@ en: charges: complete_1_of_3: "Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’" tcharge: - under_10: "Enter a total charge that is at least £10 per week" + under_10: "Enter a total charge that is at least £10.00 per week" rent_period: invalid_for_org: "%{org_name} does not charge rent %{rent_period}" carehome: @@ -516,8 +516,8 @@ en: under_soft_min_for_economic_status: "You said income was %{income}, which is below this working situation's minimum (%{minimum})" rent: outside_range_title: "You told us the rent is %{brent}" - min_hint_text: "The minimum rent expected for this type of property in this local authority is £%{soft_min_for_period}." - max_hint_text: "The maximum rent expected for this type of property in this local authority is £%{soft_max_for_period}." + min_hint_text: "The minimum rent expected for this type of property in this local authority is %{soft_min_for_period}." + max_hint_text: "The maximum rent expected for this type of property in this local authority is %{soft_max_for_period}." purchase_price: title_text: "You told us the purchase price is %{value}" hint_text: "The %{min_or_max} purchase price expected for this type of property in this local authority is %{soft_min_or_soft_max}" @@ -539,7 +539,7 @@ en: void_date: title_text: "You told us the time between the start of the tenancy and the void date is more than 2 years" shared_ownership_deposit: - title_text: "Mortgage, deposit and cash discount total should equal £%{expected_shared_ownership_deposit_value}" + title_text: "Mortgage, deposit and cash discount total should equal %{expected_shared_ownership_deposit_value}" old_persons_shared_ownership: "At least one buyer should be aged over 64 for Older persons’ shared ownership scheme" staircase_bought_seems_high: "You said %{percentage}% was bought in this staircasing transaction, which seems high. Are you sure?" monthly_charges_over_soft_max: @@ -547,8 +547,8 @@ en: student_not_child: title_text: "You told us this person is a student aged beween 16 and 19" discounted_sale_value: - title_text: "Mortgage, deposit, and grant total must equal £%{value_with_discount}" - informative_text: "Your given mortgage, deposit and grant total is £%{mortgage_deposit_and_grant_total}" + title_text: "Mortgage, deposit, and grant total must equal %{value_with_discount}" + informative_text: "Your given mortgage, deposit and grant total is %{mortgage_deposit_and_grant_total}" care_home_charges: title_text: "Care home charges should be provided if this is a care home accommodation" diff --git a/spec/helpers/interruption_screen_helper_spec.rb b/spec/helpers/interruption_screen_helper_spec.rb index fba8782da..33553f39f 100644 --- a/spec/helpers/interruption_screen_helper_spec.rb +++ b/spec/helpers/interruption_screen_helper_spec.rb @@ -4,9 +4,9 @@ RSpec.describe InterruptionScreenHelper do form_handler = FormHandler.instance let(:form) { form_handler.get_form("test_form") } let(:subsection) { form.get_subsection("household_characteristics") } - let(:user) { FactoryBot.create(:user) } + let(:user) { create(:user) } let(:lettings_log) do - FactoryBot.create( + create( :lettings_log, :in_progress, ecstat1: 1, @@ -14,6 +14,7 @@ RSpec.describe InterruptionScreenHelper do incfreq: 1, created_by: user, sex1: "F", + brent: 12_345, ) end @@ -45,7 +46,13 @@ RSpec.describe InterruptionScreenHelper do ], } expect(display_informative_text(informative_text, lettings_log)) - .to eq(I18n.t("soft_validations.net_income.hint_text", ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase, earnings: lettings_log.form.get_question("earnings", lettings_log).answer_label(lettings_log))) + .to eq( + I18n.t( + "soft_validations.net_income.hint_text", + ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase, + earnings: lettings_log.form.get_question("earnings", lettings_log).answer_label(lettings_log), + ), + ) end end @@ -62,7 +69,12 @@ RSpec.describe InterruptionScreenHelper do ], } expect(display_informative_text(informative_text, lettings_log)) - .to eq(I18n.t("test.one_argument", ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase)) + .to eq( + I18n.t( + "test.one_argument", + ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase, + ), + ) end end @@ -84,7 +96,12 @@ RSpec.describe InterruptionScreenHelper do ], } expect(display_informative_text(informative_text, lettings_log)) - .to eq(I18n.t("test.one_argument", ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase)) + .to eq( + I18n.t( + "test.one_argument", + ecstat1: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase, + ), + ) end end @@ -126,15 +143,15 @@ RSpec.describe InterruptionScreenHelper do informative_text_hash = { "arguments" => [ { - "key" => "retirement_age_for_person", - "arguments_for_key" => 1, + "key" => "field_formatted_as_currency", + "arguments_for_key" => "brent", "i18n_template" => "argument", }, ], } - allow(lettings_log).to receive(:retirement_age_for_person) + allow(lettings_log).to receive(:field_formatted_as_currency) display_informative_text(informative_text_hash, lettings_log) - expect(lettings_log).to have_received(:retirement_age_for_person).with(1) + expect(lettings_log).to have_received(:field_formatted_as_currency).with("brent") end it "returns the correct text" do @@ -143,13 +160,13 @@ RSpec.describe InterruptionScreenHelper do "translation" => translation, "arguments" => [ { - "key" => "retirement_age_for_person", - "arguments_for_key" => 1, + "key" => "field_formatted_as_currency", + "arguments_for_key" => "brent", "i18n_template" => "argument", }, ], } - expect(display_informative_text(informative_text_hash, lettings_log)).to eq(I18n.t(translation, argument: lettings_log.retirement_age_for_person(1))) + expect(display_informative_text(informative_text_hash, lettings_log)).to eq("You said this: £12,345.00") end end end @@ -178,6 +195,38 @@ RSpec.describe InterruptionScreenHelper do expect(display_title_text(title_text, lettings_log)) .to eq(I18n.t("test.title_text.one_argument", argument: lettings_log.form.get_question("ecstat1", lettings_log).answer_label(lettings_log).downcase)) end + + context "when and argument is given with a key and arguments for the key" do + it "makes the correct method call" do + title_text = { + "arguments" => [ + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "brent", + "i18n_template" => "argument", + }, + ], + } + allow(lettings_log).to receive(:field_formatted_as_currency) + display_title_text(title_text, lettings_log) + expect(lettings_log).to have_received(:field_formatted_as_currency).with("brent") + end + + it "returns the correct text" do + translation = "test.title_text.one_argument" + title_text = { + "translation" => translation, + "arguments" => [ + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "brent", + "i18n_template" => "argument", + }, + ], + } + expect(display_title_text(title_text, lettings_log)).to eq("You said this: £12,345.00") + end + end end context "when title text is not defined" do diff --git a/spec/models/form/lettings/pages/max_rent_value_check_spec.rb b/spec/models/form/lettings/pages/max_rent_value_check_spec.rb new file mode 100644 index 000000000..7a3a5544f --- /dev/null +++ b/spec/models/form/lettings/pages/max_rent_value_check_spec.rb @@ -0,0 +1,37 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::MaxRentValueCheck, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { "shared_ownership_deposit_value_check" } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[rent_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("max_rent_value_check") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "rent_in_soft_max_range?" => true }]) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ "arguments" => [{ "i18n_template" => "brent", "key" => "brent", "label" => true }], "translation" => "soft_validations.rent.outside_range_title" }) + end + + it "has the correct informative_text" do + expect(page.informative_text).to eq({ "arguments" => [{ "arguments_for_key" => "soft_max_for_period", "i18n_template" => "soft_max_for_period", "key" => "field_formatted_as_currency" }], "translation" => "soft_validations.rent.max_hint_text" }) + end +end diff --git a/spec/models/form/lettings/pages/min_rent_value_check_spec.rb b/spec/models/form/lettings/pages/min_rent_value_check_spec.rb new file mode 100644 index 000000000..4e68a09c7 --- /dev/null +++ b/spec/models/form/lettings/pages/min_rent_value_check_spec.rb @@ -0,0 +1,48 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::MinRentValueCheck, type: :model do + subject(:page) { described_class.new(nil, page_definition, subsection) } + + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has the correct header" do + expect(page.header).to be nil + end + + it "has the correct description" do + expect(page.description).to be nil + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[rent_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("min_rent_value_check") + end + + it "has correct depends_on" do + expect(page.depends_on).to eq( + [{ "rent_in_soft_min_range?" => true }], + ) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ + "translation" => "soft_validations.rent.outside_range_title", + "arguments" => [{ "i18n_template" => "brent", "key" => "brent", "label" => true }], + }) + end + + it "has the correct informative_text" do + expect(page.informative_text).to eq({ + "arguments" => [{ "arguments_for_key" => "soft_min_for_period", "i18n_template" => "soft_min_for_period", "key" => "field_formatted_as_currency" }], + "translation" => "soft_validations.rent.min_hint_text", + }) + end +end diff --git a/spec/models/form/lettings/pages/net_income_value_check_spec.rb b/spec/models/form/lettings/pages/net_income_value_check_spec.rb new file mode 100644 index 000000000..c43eb3381 --- /dev/null +++ b/spec/models/form/lettings/pages/net_income_value_check_spec.rb @@ -0,0 +1,40 @@ +require "rails_helper" + +RSpec.describe Form::Lettings::Pages::NetIncomeValueCheck, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { "shared_ownership_deposit_value_check" } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[net_income_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("net_income_value_check") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "net_income_soft_validation_triggered?" => true }]) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ "translation" => "soft_validations.net_income.title_text" }) + end + + it "has the correct informative_text" do + expect(page.informative_text).to eq({ + "arguments" => [{ "arguments_for_key" => "ecstat1", "i18n_template" => "ecstat1", "key" => "field_formatted_as_currency" }, { "arguments_for_key" => "earnings", "i18n_template" => "earnings", "key" => "field_formatted_as_currency" }], + "translation" => "soft_validations.net_income.hint_text", + }) + end +end diff --git a/spec/models/form/sales/pages/about_price_value_check_spec.rb b/spec/models/form/sales/pages/about_price_value_check_spec.rb new file mode 100644 index 000000000..6c8d27463 --- /dev/null +++ b/spec/models/form/sales/pages/about_price_value_check_spec.rb @@ -0,0 +1,54 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::AboutPriceValueCheck, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { "savings_value_check" } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[value_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("savings_value_check") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([{ "purchase_price_out_of_soft_range?" => true }]) + end + + it "is interruption screen page" do + expect(page.interruption_screen?).to eq(true) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ "arguments" => [{ "i18n_template" => "value", "key" => "value", "label" => true }], "translation" => "soft_validations.purchase_price.title_text" }) + end + + it "has the correct informative_text" do + expect(page.informative_text).to eq({ + "translation" => "soft_validations.purchase_price.hint_text", + "arguments" => [ + { + "key" => "field_formatted_as_currency", + "arguments_for_key" => "purchase_price_soft_min_or_soft_max", + "i18n_template" => "soft_min_or_soft_max", + }, + { + "key" => "purchase_price_min_or_max_text", + "i18n_template" => "min_or_max", + }, + ], + }) + end +end diff --git a/spec/models/form/sales/pages/discounted_sale_value_check_spec.rb b/spec/models/form/sales/pages/discounted_sale_value_check_spec.rb index ddd4bc33c..d086542dc 100644 --- a/spec/models/form/sales/pages/discounted_sale_value_check_spec.rb +++ b/spec/models/form/sales/pages/discounted_sale_value_check_spec.rb @@ -27,14 +27,14 @@ RSpec.describe Form::Sales::Pages::DiscountedSaleValueCheck, type: :model do it "has the correct title_text" do expect(page.title_text).to eq({ "translation" => "soft_validations.discounted_sale_value.title_text", - "arguments" => [{ "key" => "value_with_discount", "label" => false, "i18n_template" => "value_with_discount" }], + "arguments" => [{ "arguments_for_key" => "value_with_discount", "i18n_template" => "value_with_discount", "key" => "field_formatted_as_currency" }], }) end it "has the correct informative_text" do expect(page.informative_text).to eq({ "translation" => "soft_validations.discounted_sale_value.informative_text", - "arguments" => [{ "key" => "mortgage_deposit_and_grant_total", "label" => false, "i18n_template" => "mortgage_deposit_and_grant_total" }], + "arguments" => [{ "arguments_for_key" => "mortgage_deposit_and_grant_total", "i18n_template" => "mortgage_deposit_and_grant_total", "key" => "field_formatted_as_currency" }], }) end diff --git a/spec/models/form/sales/pages/shared_ownership_deposit_value_check_spec.rb b/spec/models/form/sales/pages/shared_ownership_deposit_value_check_spec.rb index 893a5cb5b..45744cde4 100644 --- a/spec/models/form/sales/pages/shared_ownership_deposit_value_check_spec.rb +++ b/spec/models/form/sales/pages/shared_ownership_deposit_value_check_spec.rb @@ -34,13 +34,7 @@ RSpec.describe Form::Sales::Pages::SharedOwnershipDepositValueCheck, type: :mode it "has the correct title_text" do expect(page.title_text).to eq({ "translation" => "soft_validations.shared_ownership_deposit.title_text", - "arguments" => [ - { - "key" => "expected_shared_ownership_deposit_value", - "label" => false, - "i18n_template" => "expected_shared_ownership_deposit_value", - }, - ], + "arguments" => [{ "arguments_for_key" => "expected_shared_ownership_deposit_value", "i18n_template" => "expected_shared_ownership_deposit_value", "key" => "field_formatted_as_currency" }], }) end diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index 0632af547..ca72794a5 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -498,7 +498,7 @@ RSpec.describe SalesLog, type: :model do let!(:completed_sales_log) { create(:sales_log, :completed, ownershipsch: 1, type: 2, value: 1000, equity: 50) } it "is set to completed for a completed sales log" do - expect(completed_sales_log.expected_shared_ownership_deposit_value).to eq("£500.00") + expect(completed_sales_log.expected_shared_ownership_deposit_value).to eq(500) end end diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index deccde0c0..fb5c1227c 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -532,11 +532,11 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing brent with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week") - expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing scharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week") - expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing pscharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week") - expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing supcharg with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week") - expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing tcharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10 per week") + expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing brent with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing scharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing pscharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing supcharg with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0b4a68df-30cc-474a-93c0-a56ce8fdad3b: Removing tcharge with error: Answer either the ‘household rent and charges’ question or ‘is this accommodation a care home‘, or select ‘no’ for ‘does the household pay rent or charges for the accommodation?’, Enter a total charge that is at least £10.00 per week") expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end From d47c4bcdc442ab02e1421c3bb7afcfe1eda37c22 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Fri, 14 Apr 2023 10:04:31 +0100 Subject: [PATCH 02/27] speed up bulk upload with missing memoization (#1539) --- app/services/bulk_upload/lettings/year2022/row_parser.rb | 6 +++--- app/services/bulk_upload/lettings/year2023/row_parser.rb | 6 +++--- .../bulk_upload/lettings/year2023/row_parser_spec.rb | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/services/bulk_upload/lettings/year2022/row_parser.rb b/app/services/bulk_upload/lettings/year2022/row_parser.rb index 255aabe97..998068792 100644 --- a/app/services/bulk_upload/lettings/year2022/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2022/row_parser.rb @@ -340,10 +340,10 @@ class BulkUpload::Lettings::Year2022::RowParser return true if blank_row? - super - log.valid? + super + log.errors.each do |error| fields = field_mapping_for_errors[error.attribute] || [] @@ -650,7 +650,7 @@ private end def questions - log.form.subsections.flat_map { |ss| ss.applicable_questions(log) } + @questions ||= log.form.subsections.flat_map { |ss| ss.applicable_questions(log) } end def validate_nulls diff --git a/app/services/bulk_upload/lettings/year2023/row_parser.rb b/app/services/bulk_upload/lettings/year2023/row_parser.rb index 60b5477ce..175c13400 100644 --- a/app/services/bulk_upload/lettings/year2023/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2023/row_parser.rb @@ -342,10 +342,10 @@ class BulkUpload::Lettings::Year2023::RowParser return true if blank_row? - super - log.valid? + super + log.errors.each do |error| fields = field_mapping_for_errors[error.attribute] || [] @@ -826,7 +826,7 @@ private end def questions - log.form.subsections.flat_map { |ss| ss.applicable_questions(log) } + @questions ||= log.form.subsections.flat_map { |ss| ss.applicable_questions(log) } end def attributes_for_log diff --git a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb index b79ee9f88..8984d9663 100644 --- a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb @@ -844,12 +844,12 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do end end - describe "#field_56" do # age3 + describe "#field_52" do # age2 context "when null but gender given" do - let(:attributes) { setup_section_params.merge({ field_56: "", field_57: "F" }) } + let(:attributes) { setup_section_params.merge({ field_52: "", field_53: "F" }) } it "returns an error" do - expect(parser.errors[:field_56]).to be_present + expect(parser.errors[:field_52]).to be_present end end end From 6bb0005e7db146a4ba6aa71c1949374b2e9b82f2 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:42:42 +0100 Subject: [PATCH 03/27] CLDC-2023 Add livein soft validation (#1521) * Add buyer_livein_value_check column * Add validation form elements * Add validations * Add error messageand update import * Setup fixes * Typos * Add missing translation * Rename soft validation methods * Downcase ownership scheme --- .../sales/pages/buyer_live_in_value_check.rb | 21 ++ .../questions/buyer_live_in_value_check.rb | 24 +++ .../subsections/household_characteristics.rb | 2 + app/models/form/sales/subsections/setup.rb | 2 + app/models/sales_log.rb | 13 +- .../validations/sales/soft_validations.rb | 13 ++ .../imports/sales_logs_import_service.rb | 4 +- config/locales/en.yml | 4 + ...30405140343_add_buyer_livin_value_check.rb | 5 + db/schema.rb | 1 + .../pages/buyer_live_in_value_check_spec.rb | 64 ++++++ .../buyer_live_in_value_check_spec.rb | 62 ++++++ .../household_characteristics_spec.rb | 4 + .../form/sales/subsections/setup_spec.rb | 2 + spec/models/form_spec.rb | 4 +- spec/models/sales_log_spec.rb | 2 + .../sales/soft_validations_spec.rb | 183 ++++++++++++++++++ 17 files changed, 406 insertions(+), 4 deletions(-) create mode 100644 app/models/form/sales/pages/buyer_live_in_value_check.rb create mode 100644 app/models/form/sales/questions/buyer_live_in_value_check.rb create mode 100644 db/migrate/20230405140343_add_buyer_livin_value_check.rb create mode 100644 spec/models/form/sales/pages/buyer_live_in_value_check_spec.rb create mode 100644 spec/models/form/sales/questions/buyer_live_in_value_check_spec.rb diff --git a/app/models/form/sales/pages/buyer_live_in_value_check.rb b/app/models/form/sales/pages/buyer_live_in_value_check.rb new file mode 100644 index 000000000..067ba96ca --- /dev/null +++ b/app/models/form/sales/pages/buyer_live_in_value_check.rb @@ -0,0 +1,21 @@ +class Form::Sales::Pages::BuyerLiveInValueCheck < Form::Sales::Pages::Person + def initialize(id, hsh, subsection, person_index:) + super + @depends_on = [ + { + "buyer#{person_index}_livein_wrong_for_ownership_type?" => true, + }, + ] + @title_text = { + "translation" => "soft_validations.buyer#{person_index}_livein_wrong_for_ownership_type.title_text", + "arguments" => [{ "key" => "ownership_scheme", "label" => false, "i18n_template" => "ownership_scheme" }], + } + @informative_text = {} + end + + def questions + @questions ||= [ + Form::Sales::Questions::BuyerLiveInValueCheck.new(nil, nil, self, person_index: @person_index), + ] + end +end diff --git a/app/models/form/sales/questions/buyer_live_in_value_check.rb b/app/models/form/sales/questions/buyer_live_in_value_check.rb new file mode 100644 index 000000000..a4209c38c --- /dev/null +++ b/app/models/form/sales/questions/buyer_live_in_value_check.rb @@ -0,0 +1,24 @@ +class Form::Sales::Questions::BuyerLiveInValueCheck < ::Form::Question + def initialize(id, hsh, page, person_index:) + super(id, hsh, page) + @id = "buyer_livein_value_check" + @check_answer_label = "Buyer live in confirmation" + @type = "interruption_screen" + @answer_options = { + "0" => { "value" => "Yes" }, + "1" => { "value" => "No" }, + } + @hidden_in_check_answers = { + "depends_on" => [ + { + "buyer_livein_value_check" => 0, + }, + { + "buyer_livein_value_check" => 1, + }, + ], + } + @check_answers_card_number = person_index + @header = "Are you sure this is correct?" + end +end diff --git a/app/models/form/sales/subsections/household_characteristics.rb b/app/models/form/sales/subsections/household_characteristics.rb index 922d95edd..64b0b95ea 100644 --- a/app/models/form/sales/subsections/household_characteristics.rb +++ b/app/models/form/sales/subsections/household_characteristics.rb @@ -26,6 +26,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::RetirementValueCheck.new("working_situation_1_retirement_value_check", nil, self, person_index: 1), Form::Sales::Pages::Buyer1IncomeValueCheck.new("working_situation_buyer_1_income_value_check", nil, self), Form::Sales::Pages::Buyer1LiveInProperty.new(nil, nil, self), + Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_1_live_in_property_value_check", nil, self, person_index: 1), Form::Sales::Pages::Buyer2RelationshipToBuyer1.new(nil, nil, self), Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_relationship_student_not_child_value_check", nil, self, person_index: 2), Form::Sales::Pages::Age2.new(nil, nil, self), @@ -40,6 +41,7 @@ class Form::Sales::Subsections::HouseholdCharacteristics < ::Form::Subsection Form::Sales::Pages::Buyer2IncomeValueCheck.new("working_situation_buyer_2_income_value_check", nil, self), Form::Sales::Pages::PersonStudentNotChildValueCheck.new("buyer_2_working_situation_student_not_child_value_check", nil, self, person_index: 2), Form::Sales::Pages::Buyer2LiveInProperty.new(nil, nil, self), + Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_2_live_in_property_value_check", nil, self, person_index: 2), Form::Sales::Pages::NumberOfOthersInProperty.new("number_of_others_in_property", nil, self, joint_purchase: false), Form::Sales::Pages::NumberOfOthersInProperty.new("number_of_others_in_property_joint_purchase", nil, self, joint_purchase: true), Form::Sales::Pages::PersonKnown.new("person_2_known", nil, self, person_index: 2), diff --git a/app/models/form/sales/subsections/setup.rb b/app/models/form/sales/subsections/setup.rb index d1bb9dd6b..c723b732c 100644 --- a/app/models/form/sales/subsections/setup.rb +++ b/app/models/form/sales/subsections/setup.rb @@ -19,6 +19,8 @@ class Form::Sales::Subsections::Setup < ::Form::Subsection Form::Sales::Pages::OldPersonsSharedOwnershipValueCheck.new("ownership_type_old_persons_shared_ownership_value_check", nil, self), Form::Sales::Pages::MonthlyChargesValueCheck.new("monthly_charges_type_value_check", nil, self), Form::Sales::Pages::DiscountedSaleValueCheck.new("discounted_sale_type_value_check", nil, self), + Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_1_live_in_property_type_value_check", nil, self, person_index: 1), + Form::Sales::Pages::BuyerLiveInValueCheck.new("buyer_2_live_in_property_type_value_check", nil, self, person_index: 2), Form::Sales::Pages::BuyerCompany.new(nil, nil, self), Form::Sales::Pages::BuyerLive.new(nil, nil, self), Form::Sales::Pages::JointPurchase.new(nil, nil, self), diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index a47edea0f..ebb3ef4e3 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -43,7 +43,7 @@ class SalesLog < Log } scope :filter_by_organisation, ->(org, _user = nil) { where(owning_organisation: org) } - OPTIONAL_FIELDS = %w[saledate_check purchid monthly_charges_value_check old_persons_shared_ownership_value_check othtype discounted_sale_value_check].freeze + OPTIONAL_FIELDS = %w[saledate_check purchid monthly_charges_value_check old_persons_shared_ownership_value_check othtype discounted_sale_value_check buyer_livein_value_check].freeze RETIREMENT_AGES = { "M" => 65, "F" => 60, "X" => 65 }.freeze def lettings? @@ -345,4 +345,15 @@ class SalesLog < Log def beds_for_la_sale_range beds.nil? ? nil : [beds, LaSaleRange::MAX_BEDS].min end + + def ownership_scheme + case ownershipsch + when 1 + "shared ownership" + when 2 + "discounted ownership" + when 3 + "outright sale" + end + end end diff --git a/app/models/validations/sales/soft_validations.rb b/app/models/validations/sales/soft_validations.rb index d72118d05..354bc7fd7 100644 --- a/app/models/validations/sales/soft_validations.rb +++ b/app/models/validations/sales/soft_validations.rb @@ -123,6 +123,19 @@ module Validations::Sales::SoftValidations mortgage_deposit_and_grant_total != value_with_discount && discounted_ownership_sale? end + def buyer1_livein_wrong_for_ownership_type? + return unless ownershipsch && buy1livein + + (discounted_ownership_sale? || shared_ownership_scheme?) && buy1livein == 2 + end + + def buyer2_livein_wrong_for_ownership_type? + return unless ownershipsch && buy2livein + return unless joint_purchase? + + (discounted_ownership_sale? || shared_ownership_scheme?) && buy2livein == 2 + end + private def sale_range diff --git a/app/services/imports/sales_logs_import_service.rb b/app/services/imports/sales_logs_import_service.rb index 2fb619619..e02d7d23c 100644 --- a/app/services/imports/sales_logs_import_service.rb +++ b/app/services/imports/sales_logs_import_service.rb @@ -155,6 +155,7 @@ module Imports attributes["monthly_charges_value_check"] = 0 attributes["student_not_child_value_check"] = 0 attributes["discounted_sale_value_check"] = 0 + attributes["buyer_livein_value_check"] = 0 # Sets the log creator owner_id = meta_field_value(xml_doc, "owner-user-id").strip @@ -278,7 +279,8 @@ module Imports hodate_check saledate_check student_not_child_value_check - discounted_sale_value_check] + discounted_sale_value_check + buyer_livein_value_check] end def check_status_completed(sales_log, previous_status) diff --git a/config/locales/en.yml b/config/locales/en.yml index dc36f5f64..d333accd8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -551,6 +551,10 @@ en: informative_text: "Your given mortgage, deposit and grant total is %{mortgage_deposit_and_grant_total}" care_home_charges: title_text: "Care home charges should be provided if this is a care home accommodation" + buyer1_livein_wrong_for_ownership_type: + title_text: "You told us that buyer 1 will not live in the property. For %{ownership_scheme} types, the buyer usually lives in the property." + buyer2_livein_wrong_for_ownership_type: + title_text: "You told us that buyer 2 will not live in the property. For %{ownership_scheme} types, the buyer usually lives in the property." devise: two_factor_authentication: diff --git a/db/migrate/20230405140343_add_buyer_livin_value_check.rb b/db/migrate/20230405140343_add_buyer_livin_value_check.rb new file mode 100644 index 000000000..feafc610b --- /dev/null +++ b/db/migrate/20230405140343_add_buyer_livin_value_check.rb @@ -0,0 +1,5 @@ +class AddBuyerLivinValueCheck < ActiveRecord::Migration[7.0] + def change + add_column :sales_logs, :buyer_livein_value_check, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 77ad1f3ea..8a14eed1d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -573,6 +573,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_04_12_143245) do t.string "county" t.integer "discounted_sale_value_check" t.integer "student_not_child_value_check" + t.integer "buyer_livein_value_check" t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" t.index ["old_id"], name: "index_sales_logs_on_old_id", unique: true diff --git a/spec/models/form/sales/pages/buyer_live_in_value_check_spec.rb b/spec/models/form/sales/pages/buyer_live_in_value_check_spec.rb new file mode 100644 index 000000000..9d00b086b --- /dev/null +++ b/spec/models/form/sales/pages/buyer_live_in_value_check_spec.rb @@ -0,0 +1,64 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::BuyerLiveInValueCheck, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection, person_index:) } + + let(:page_id) { "buyer_1_live_in_value_check" } + let(:page_definition) { nil } + let(:person_index) { 1 } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[buyer_livein_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("buyer_1_live_in_value_check") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([ + { + "buyer1_livein_wrong_for_ownership_type?" => true, + }, + ]) + end + + it "is interruption screen page" do + expect(page.interruption_screen?).to eq(true) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ + "translation" => "soft_validations.buyer1_livein_wrong_for_ownership_type.title_text", + "arguments" => [{ "key" => "ownership_scheme", "label" => false, "i18n_template" => "ownership_scheme" }], + }) + end + + context "with buyer 2" do + let(:person_index) { 2 } + + it "has correct depends_on" do + expect(page.depends_on).to eq([ + { + "buyer2_livein_wrong_for_ownership_type?" => true, + }, + ]) + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ + "translation" => "soft_validations.buyer2_livein_wrong_for_ownership_type.title_text", + "arguments" => [{ "key" => "ownership_scheme", "label" => false, "i18n_template" => "ownership_scheme" }], + }) + end + end +end diff --git a/spec/models/form/sales/questions/buyer_live_in_value_check_spec.rb b/spec/models/form/sales/questions/buyer_live_in_value_check_spec.rb new file mode 100644 index 000000000..0409f4f2e --- /dev/null +++ b/spec/models/form/sales/questions/buyer_live_in_value_check_spec.rb @@ -0,0 +1,62 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::BuyerLiveInValueCheck, type: :model do + subject(:question) { described_class.new(question_id, question_definition, page, person_index:) } + + let(:question_id) { nil } + let(:question_definition) { nil } + let(:person_index) { 1 } + let(:page) { instance_double(Form::Page) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("buyer_livein_value_check") + end + + it "has the correct header" do + expect(question.header).to eq("Are you sure this is correct?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Buyer live in confirmation") + end + + it "has the correct type" do + expect(question.type).to eq("interruption_screen") + 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 + + it "has a correct check_answers_card_number" do + expect(question.check_answers_card_number).to eq(1) + end + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "0" => { "value" => "Yes" }, + "1" => { "value" => "No" }, + }) + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers).to eq({ + "depends_on" => [ + { + "buyer_livein_value_check" => 0, + }, + { + "buyer_livein_value_check" => 1, + }, + ], + }) + end +end diff --git a/spec/models/form/sales/subsections/household_characteristics_spec.rb b/spec/models/form/sales/subsections/household_characteristics_spec.rb index 57a9ce019..c926baa08 100644 --- a/spec/models/form/sales/subsections/household_characteristics_spec.rb +++ b/spec/models/form/sales/subsections/household_characteristics_spec.rb @@ -39,6 +39,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model working_situation_1_retirement_value_check working_situation_buyer_1_income_value_check buyer_1_live_in_property + buyer_1_live_in_property_value_check buyer_2_relationship_to_buyer_1 buyer_2_relationship_student_not_child_value_check buyer_2_age @@ -52,6 +53,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model working_situation_buyer_2_income_value_check buyer_2_working_situation_student_not_child_value_check buyer_2_live_in_property + buyer_2_live_in_property_value_check number_of_others_in_property number_of_others_in_property_joint_purchase person_2_known @@ -141,6 +143,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model working_situation_1_retirement_value_check working_situation_buyer_1_income_value_check buyer_1_live_in_property + buyer_1_live_in_property_value_check buyer_2_relationship_to_buyer_1 buyer_2_relationship_student_not_child_value_check buyer_2_age @@ -161,6 +164,7 @@ RSpec.describe Form::Sales::Subsections::HouseholdCharacteristics, type: :model working_situation_buyer_2_income_value_check buyer_2_working_situation_student_not_child_value_check buyer_2_live_in_property + buyer_2_live_in_property_value_check number_of_others_in_property number_of_others_in_property_joint_purchase person_2_known diff --git a/spec/models/form/sales/subsections/setup_spec.rb b/spec/models/form/sales/subsections/setup_spec.rb index 92271ba25..7f12a8498 100644 --- a/spec/models/form/sales/subsections/setup_spec.rb +++ b/spec/models/form/sales/subsections/setup_spec.rb @@ -26,6 +26,8 @@ RSpec.describe Form::Sales::Subsections::Setup, type: :model do ownership_type_old_persons_shared_ownership_value_check monthly_charges_type_value_check discounted_sale_type_value_check + buyer_1_live_in_property_type_value_check + buyer_2_live_in_property_type_value_check buyer_company buyer_live joint_purchase diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index a1cf650c0..327a79a2f 100644 --- a/spec/models/form_spec.rb +++ b/spec/models/form_spec.rb @@ -247,9 +247,9 @@ RSpec.describe Form, type: :model do expect(form.sections[0].class).to eq(Form::Sales::Sections::Setup) expect(form.subsections.count).to eq(1) expect(form.subsections.first.id).to eq("setup") - expect(form.pages.count).to eq(16) + expect(form.pages.count).to eq(18) expect(form.pages.first.id).to eq("organisation") - expect(form.questions.count).to eq(17) + expect(form.questions.count).to eq(19) expect(form.questions.first.id).to eq("owning_organisation_id") expect(form.start_date).to eq(Time.zone.parse("2022-04-01")) expect(form.end_date).to eq(Time.zone.parse("2023-06-07")) diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index ca72794a5..e9acd4548 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -61,6 +61,7 @@ RSpec.describe SalesLog, type: :model do old_persons_shared_ownership_value_check othtype discounted_sale_value_check + buyer_livein_value_check proplen mortlen frombeds @@ -79,6 +80,7 @@ RSpec.describe SalesLog, type: :model do old_persons_shared_ownership_value_check othtype discounted_sale_value_check + buyer_livein_value_check address_line2 county postcode_full diff --git a/spec/models/validations/sales/soft_validations_spec.rb b/spec/models/validations/sales/soft_validations_spec.rb index 712e53965..ae20e1111 100644 --- a/spec/models/validations/sales/soft_validations_spec.rb +++ b/spec/models/validations/sales/soft_validations_spec.rb @@ -913,4 +913,187 @@ RSpec.describe Validations::Sales::SoftValidations do end end end + + describe "#buyer1_livein_wrong_for_ownership_type?" do + context "when it's a shared ownership" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 1) } + + context "and buy1livein is no" do + before do + record.buy1livein = 2 + end + + it "returns true" do + expect(record).to be_buyer1_livein_wrong_for_ownership_type + end + end + + context "and buy1livein is yes" do + before do + record.buy1livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer1_livein_wrong_for_ownership_type + end + end + end + + context "when it's a discounted ownership" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 2) } + + context "and buy1livein is no" do + before do + record.buy1livein = 2 + end + + it "returns true" do + expect(record).to be_buyer1_livein_wrong_for_ownership_type + end + end + + context "and buy1livein is yes" do + before do + record.buy1livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer1_livein_wrong_for_ownership_type + end + end + end + + context "when it's a outright sale" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3) } + + context "and buy1livein is no" do + before do + record.buy1livein = 2 + end + + it "returns false" do + expect(record).not_to be_buyer1_livein_wrong_for_ownership_type + end + end + + context "and buy1livein is yes" do + before do + record.buy1livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer1_livein_wrong_for_ownership_type + end + end + end + + context "when ownership is not given" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3) } + + before do + record.ownershipsch = nil + end + + it "returns false" do + expect(record).not_to be_buyer1_livein_wrong_for_ownership_type + end + end + end + + describe "#buyer2_livein_wrong_for_ownership_type?" do + context "when it's a shared ownership" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 1, jointpur: 1) } + + context "and buy2livein is no" do + before do + record.buy2livein = 2 + end + + it "returns true" do + expect(record).to be_buyer2_livein_wrong_for_ownership_type + end + end + + context "and buy2livein is yes" do + before do + record.buy2livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + + context "and not a joint purchase" do + before do + record.buy2livein = 2 + record.jointpur = 2 + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + end + + context "when it's a discounted ownership" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 2, jointpur: 1) } + + context "and buy2livein is no" do + before do + record.buy2livein = 2 + end + + it "returns true" do + expect(record).to be_buyer2_livein_wrong_for_ownership_type + end + end + + context "and buy2livein is yes" do + before do + record.buy2livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + end + + context "when it's a outright sale" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3, jointpur: 1) } + + context "and buy2livein is no" do + before do + record.buy2livein = 2 + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + + context "and buy2livein is yes" do + before do + record.buy2livein = 1 + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + end + + context "when ownership is not given" do + let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3, jointpur: 1) } + + before do + record.ownershipsch = nil + end + + it "returns false" do + expect(record).not_to be_buyer2_livein_wrong_for_ownership_type + end + end + end end From 5d36752d34e53af7169b0d496aad33e312468392 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Fri, 14 Apr 2023 10:58:03 +0100 Subject: [PATCH 04/27] Clear fields on import validations (#1540) * Clear charge values if they fail under_10 validation on import * Clear charges if brent is over_hard_max when importing --- .../validations/financial_validations.rb | 4 +- .../imports/lettings_logs_import_service.rb | 2 + .../lettings_logs_import_service_spec.rb | 72 +++++++++++++++++++ 3 files changed, 76 insertions(+), 2 deletions(-) diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index 3a0014119..82fdf56f3 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -99,7 +99,7 @@ module Validations::FinancialValidations end if record.tcharge.present? && weekly_value_in_range(record, "tcharge", 0, 9.99) - record.errors.add :tcharge, I18n.t("validations.financial.tcharge.under_10") + record.errors.add :tcharge, :under_10, message: I18n.t("validations.financial.tcharge.under_10") end answered_questions = [record.tcharge, record.chcharge].concat(record.household_charge && record.household_charge == 1 ? [record.household_charge] : []) @@ -224,7 +224,7 @@ private end if record.weekly_value(record["brent"]) > rent_range.hard_max - record.errors.add :brent, I18n.t("validations.financial.brent.above_hard_max") + record.errors.add :brent, :over_hard_max, message: I18n.t("validations.financial.brent.above_hard_max") record.errors.add :beds, I18n.t("validations.financial.brent.beds.above_hard_max") record.errors.add :la, I18n.t("validations.financial.brent.la.above_hard_max") record.errors.add :postcode_known, I18n.t("validations.financial.brent.postcode_known.above_hard_max") diff --git a/app/services/imports/lettings_logs_import_service.rb b/app/services/imports/lettings_logs_import_service.rb index 94fb2ec3e..01c71faef 100644 --- a/app/services/imports/lettings_logs_import_service.rb +++ b/app/services/imports/lettings_logs_import_service.rb @@ -302,6 +302,8 @@ module Imports %i[supcharg outside_the_range] => %w[brent scharge pscharge supcharg tcharge], %i[scharge outside_the_range] => %w[brent scharge pscharge supcharg tcharge], %i[location_id not_active] => %w[location_id scheme_id], + %i[tcharge under_10] => %w[brent scharge pscharge supcharg tcharge], + %i[brent over_hard_max] => %w[brent scharge pscharge supcharg tcharge], } (2..8).each do |person| diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index fb5c1227c..456488493 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -719,6 +719,78 @@ RSpec.describe Imports::LettingsLogsImportService do end end + context "and tcharge is less than £10 per week" do + before do + lettings_log_xml.at_xpath("//xmlns:Q18ai").content = "1" + lettings_log_xml.at_xpath("//xmlns:Q18aii").content = "2" + lettings_log_xml.at_xpath("//xmlns:Q18aiii").content = "3" + lettings_log_xml.at_xpath("//xmlns:Q18aiv").content = "3" + lettings_log_xml.at_xpath("//xmlns:Q18av").content = "9" + end + + it "intercepts the relevant validation error" do + expect(logger).to receive(:warn).with(/Removing brent with error: Enter a total charge that is at least £10 per week/) + expect(logger).to receive(:warn).with(/Removing scharge with error: Enter a total charge that is at least £10 per week/) + expect(logger).to receive(:warn).with(/Removing pscharge with error: Enter a total charge that is at least £10 per week/) + expect(logger).to receive(:warn).with(/Removing supcharg with error: Enter a total charge that is at least £10 per week/) + expect(logger).to receive(:warn).with(/Removing tcharge with error: Enter a total charge that is at least £10 per week/) + expect { lettings_log_service.send(:create_log, lettings_log_xml) } + .not_to raise_error + end + + it "clears out the charges answers" do + allow(logger).to receive(:warn) + + lettings_log_service.send(:create_log, lettings_log_xml) + lettings_log = LettingsLog.find_by(old_id: lettings_log_id) + + expect(lettings_log).not_to be_nil + expect(lettings_log.tcharge).to be_nil + end + end + + context "and rent is higher than the absolute maximum expected for a property " do + before do + LaRentRange.create!( + ranges_rent_id: "2", + la: "E08000035", + beds: 2, + lettype: 1, + soft_min: 12.41, + soft_max: 89.54, + hard_min: 9.87, + hard_max: 100.99, + start_year: 2021, + ) + + lettings_log_xml.at_xpath("//xmlns:Q18ai").content = "500" + lettings_log_xml.at_xpath("//xmlns:Q18aii").content = "2" + lettings_log_xml.at_xpath("//xmlns:Q18aiii").content = "3" + lettings_log_xml.at_xpath("//xmlns:Q18aiv").content = "3" + lettings_log_xml.at_xpath("//xmlns:Q18av").content = "508" + end + + it "intercepts the relevant validation error" do + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing brent with error: Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing scharge with error: Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing pscharge with error: Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing supcharg with error: Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing tcharge with error: Rent is higher than the absolute maximum expected for a property of this type. Please check the rent, rent period, local authority and (if general needs) number of bedrooms") + expect { lettings_log_service.send(:create_log, lettings_log_xml) } + .not_to raise_error + end + + it "clears out the charges answers" do + allow(logger).to receive(:warn) + + lettings_log_service.send(:create_log, lettings_log_xml) + lettings_log = LettingsLog.find_by(old_id: lettings_log_id) + + expect(lettings_log).not_to be_nil + expect(lettings_log.tcharge).to be_nil + end + end + context "and location is not active during the period" do let(:lettings_log_id) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" } From 3d2f362106eeaecc8356a841c610c453ae1da60f Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:07:09 +0100 Subject: [PATCH 05/27] CLDC-2013 Add percentage discount validation (#1516) * Add percentage_discount_value_check column * Add percentage discount form elements * Add soft validation method * Add validation message * Update import --- .../pages/percentage_discount_value_check.rb | 15 ++ .../percentage_discount_value_check.rb | 23 +++ .../discounted_ownership_scheme.rb | 1 + .../sales/subsections/property_information.rb | 1 + .../validations/sales/soft_validations.rb | 11 ++ .../imports/sales_logs_import_service.rb | 4 +- config/locales/en.yml | 2 + ...138_add_percentage_discount_value_check.rb | 5 + db/schema.rb | 1 + .../percentage_discount_value_check_spec.rb | 48 ++++++ .../percentage_discount_value_check_spec.rb | 57 ++++++++ .../discounted_ownership_scheme_spec.rb | 1 + .../subsections/property_information_spec.rb | 2 + .../sales/soft_validations_spec.rb | 138 ++++++++++++++++++ 14 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 app/models/form/sales/pages/percentage_discount_value_check.rb create mode 100644 app/models/form/sales/questions/percentage_discount_value_check.rb create mode 100644 db/migrate/20230405074138_add_percentage_discount_value_check.rb create mode 100644 spec/models/form/sales/pages/percentage_discount_value_check_spec.rb create mode 100644 spec/models/form/sales/questions/percentage_discount_value_check_spec.rb diff --git a/app/models/form/sales/pages/percentage_discount_value_check.rb b/app/models/form/sales/pages/percentage_discount_value_check.rb new file mode 100644 index 000000000..1e3beb3e6 --- /dev/null +++ b/app/models/form/sales/pages/percentage_discount_value_check.rb @@ -0,0 +1,15 @@ +class Form::Sales::Pages::PercentageDiscountValueCheck < ::Form::Page + def initialize(id, hsh, subsection) + super + @title_text = { + "translation" => "soft_validations.percentage_discount_value.title_text", + "arguments" => [{ "key" => "discount", "label" => true, "i18n_template" => "discount" }], + } + @informative_text = {} + @depends_on = [{ "percentage_discount_invalid?" => true }] + end + + def questions + @questions ||= [Form::Sales::Questions::PercentageDiscountValueCheck.new(nil, nil, self)] + end +end diff --git a/app/models/form/sales/questions/percentage_discount_value_check.rb b/app/models/form/sales/questions/percentage_discount_value_check.rb new file mode 100644 index 000000000..9ac5547b4 --- /dev/null +++ b/app/models/form/sales/questions/percentage_discount_value_check.rb @@ -0,0 +1,23 @@ +class Form::Sales::Questions::PercentageDiscountValueCheck < ::Form::Question + def initialize(id, hsh, page) + super + @id = "percentage_discount_value_check" + @check_answer_label = "Percentage discount confirmation" + @header = "Are you sure this is correct?" + @type = "interruption_screen" + @answer_options = { + "0" => { "value" => "Yes" }, + "1" => { "value" => "No" }, + } + @hidden_in_check_answers = { + "depends_on" => [ + { + "percentage_discount_value_check" => 0, + }, + { + "percentage_discount_value_check" => 1, + }, + ], + } + 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 09813339d..52ee9e95c 100644 --- a/app/models/form/sales/subsections/discounted_ownership_scheme.rb +++ b/app/models/form/sales/subsections/discounted_ownership_scheme.rb @@ -11,6 +11,7 @@ class Form::Sales::Subsections::DiscountedOwnershipScheme < ::Form::Subsection Form::Sales::Pages::LivingBeforePurchase.new("living_before_purchase_discounted_ownership", nil, self, ownershipsch: 2), Form::Sales::Pages::AboutPriceRtb.new(nil, nil, self), Form::Sales::Pages::ExtraBorrowingValueCheck.new("extra_borrowing_price_value_check", nil, self), + Form::Sales::Pages::PercentageDiscountValueCheck.new("percentage_discount_value_check", nil, self), Form::Sales::Pages::AboutPriceNotRtb.new(nil, nil, self), Form::Sales::Pages::GrantValueCheck.new(nil, nil, self), Form::Sales::Pages::PurchasePriceOutrightOwnership.new("purchase_price_discounted_ownership", nil, self, ownershipsch: 2), diff --git a/app/models/form/sales/subsections/property_information.rb b/app/models/form/sales/subsections/property_information.rb index cca34a764..95d8485c8 100644 --- a/app/models/form/sales/subsections/property_information.rb +++ b/app/models/form/sales/subsections/property_information.rb @@ -13,6 +13,7 @@ class Form::Sales::Subsections::PropertyInformation < ::Form::Subsection Form::Sales::Pages::AboutPriceValueCheck.new("about_price_bedrooms_value_check", nil, self), Form::Sales::Pages::PropertyUnitType.new(nil, nil, self), Form::Sales::Pages::MonthlyChargesValueCheck.new("monthly_charges_property_type_value_check", nil, self), + Form::Sales::Pages::PercentageDiscountValueCheck.new("percentage_discount_proptype_value_check", nil, self), Form::Sales::Pages::PropertyBuildingType.new(nil, nil, self), postcode_and_la_questions, Form::Sales::Pages::AboutPriceValueCheck.new("about_price_la_value_check", nil, self), diff --git a/app/models/validations/sales/soft_validations.rb b/app/models/validations/sales/soft_validations.rb index 354bc7fd7..19d150c7e 100644 --- a/app/models/validations/sales/soft_validations.rb +++ b/app/models/validations/sales/soft_validations.rb @@ -136,6 +136,17 @@ module Validations::Sales::SoftValidations (discounted_ownership_sale? || shared_ownership_scheme?) && buy2livein == 2 end + def percentage_discount_invalid? + return unless discount && proptype + + case proptype + when 1, 2 + discount > 50 + when 3, 4, 9 + discount > 35 + end + end + private def sale_range diff --git a/app/services/imports/sales_logs_import_service.rb b/app/services/imports/sales_logs_import_service.rb index e02d7d23c..2d6551189 100644 --- a/app/services/imports/sales_logs_import_service.rb +++ b/app/services/imports/sales_logs_import_service.rb @@ -156,6 +156,7 @@ module Imports attributes["student_not_child_value_check"] = 0 attributes["discounted_sale_value_check"] = 0 attributes["buyer_livein_value_check"] = 0 + attributes["percentage_discount_value_check"] = 0 # Sets the log creator owner_id = meta_field_value(xml_doc, "owner-user-id").strip @@ -280,7 +281,8 @@ module Imports saledate_check student_not_child_value_check discounted_sale_value_check - buyer_livein_value_check] + buyer_livein_value_check + percentage_discount_value_check] end def check_status_completed(sales_log, previous_status) diff --git a/config/locales/en.yml b/config/locales/en.yml index d333accd8..f0b52ce9f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -555,6 +555,8 @@ en: title_text: "You told us that buyer 1 will not live in the property. For %{ownership_scheme} types, the buyer usually lives in the property." buyer2_livein_wrong_for_ownership_type: title_text: "You told us that buyer 2 will not live in the property. For %{ownership_scheme} types, the buyer usually lives in the property." + percentage_discount_value: + title_text: "You told us that the percentage discount was %{discount}. This seems high for this type of property." devise: two_factor_authentication: diff --git a/db/migrate/20230405074138_add_percentage_discount_value_check.rb b/db/migrate/20230405074138_add_percentage_discount_value_check.rb new file mode 100644 index 000000000..adce0fe58 --- /dev/null +++ b/db/migrate/20230405074138_add_percentage_discount_value_check.rb @@ -0,0 +1,5 @@ +class AddPercentageDiscountValueCheck < ActiveRecord::Migration[7.0] + def change + add_column :sales_logs, :percentage_discount_value_check, :integer + end +end diff --git a/db/schema.rb b/db/schema.rb index 8a14eed1d..e121fda09 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -574,6 +574,7 @@ ActiveRecord::Schema[7.0].define(version: 2023_04_12_143245) do t.integer "discounted_sale_value_check" t.integer "student_not_child_value_check" t.integer "buyer_livein_value_check" + t.integer "percentage_discount_value_check" t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id" t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id" t.index ["old_id"], name: "index_sales_logs_on_old_id", unique: true diff --git a/spec/models/form/sales/pages/percentage_discount_value_check_spec.rb b/spec/models/form/sales/pages/percentage_discount_value_check_spec.rb new file mode 100644 index 000000000..d933e3278 --- /dev/null +++ b/spec/models/form/sales/pages/percentage_discount_value_check_spec.rb @@ -0,0 +1,48 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Pages::PercentageDiscountValueCheck, type: :model do + subject(:page) { described_class.new(page_id, page_definition, subsection) } + + let(:page_id) { "percentage_discount_value_check" } + let(:page_definition) { nil } + let(:subsection) { instance_double(Form::Subsection) } + + it "has correct subsection" do + expect(page.subsection).to eq(subsection) + end + + it "has correct questions" do + expect(page.questions.map(&:id)).to eq(%w[percentage_discount_value_check]) + end + + it "has the correct id" do + expect(page.id).to eq("percentage_discount_value_check") + end + + it "has the correct header" do + expect(page.header).to be_nil + end + + it "has the correct title_text" do + expect(page.title_text).to eq({ + "translation" => "soft_validations.percentage_discount_value.title_text", + "arguments" => [{ "key" => "discount", "label" => true, "i18n_template" => "discount" }], + }) + end + + it "has the correct informative_text" do + expect(page.informative_text).to eq({}) + end + + it "is interruption screen page" do + expect(page.interruption_screen?).to eq(true) + end + + it "has correct depends_on" do + expect(page.depends_on).to eq([ + { + "percentage_discount_invalid?" => true, + }, + ]) + end +end diff --git a/spec/models/form/sales/questions/percentage_discount_value_check_spec.rb b/spec/models/form/sales/questions/percentage_discount_value_check_spec.rb new file mode 100644 index 000000000..72f4f0cbb --- /dev/null +++ b/spec/models/form/sales/questions/percentage_discount_value_check_spec.rb @@ -0,0 +1,57 @@ +require "rails_helper" + +RSpec.describe Form::Sales::Questions::PercentageDiscountValueCheck, 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) } + + it "has correct page" do + expect(question.page).to eq(page) + end + + it "has the correct id" do + expect(question.id).to eq("percentage_discount_value_check") + end + + it "has the correct header" do + expect(question.header).to eq("Are you sure this is correct?") + end + + it "has the correct check_answer_label" do + expect(question.check_answer_label).to eq("Percentage discount confirmation") + end + + it "has the correct type" do + expect(question.type).to eq("interruption_screen") + 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 + + it "has the correct answer_options" do + expect(question.answer_options).to eq({ + "0" => { "value" => "Yes" }, + "1" => { "value" => "No" }, + }) + end + + it "has the correct hidden_in_check_answers" do + expect(question.hidden_in_check_answers).to eq({ + "depends_on" => [ + { + "percentage_discount_value_check" => 0, + }, + { + "percentage_discount_value_check" => 1, + }, + ], + }) + end +end diff --git a/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb b/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb index 5c0dbfea0..9aa0aa102 100644 --- a/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb +++ b/spec/models/form/sales/subsections/discounted_ownership_scheme_spec.rb @@ -17,6 +17,7 @@ RSpec.describe Form::Sales::Subsections::DiscountedOwnershipScheme, type: :model living_before_purchase_discounted_ownership about_price_rtb extra_borrowing_price_value_check + percentage_discount_value_check about_price_not_rtb grant_value_check purchase_price_discounted_ownership diff --git a/spec/models/form/sales/subsections/property_information_spec.rb b/spec/models/form/sales/subsections/property_information_spec.rb index 1c049ea97..7a0c57448 100644 --- a/spec/models/form/sales/subsections/property_information_spec.rb +++ b/spec/models/form/sales/subsections/property_information_spec.rb @@ -24,6 +24,7 @@ RSpec.describe Form::Sales::Subsections::PropertyInformation, type: :model do about_price_bedrooms_value_check property_unit_type monthly_charges_property_type_value_check + percentage_discount_proptype_value_check property_building_type property_postcode property_local_authority @@ -49,6 +50,7 @@ RSpec.describe Form::Sales::Subsections::PropertyInformation, type: :model do about_price_bedrooms_value_check property_unit_type monthly_charges_property_type_value_check + percentage_discount_proptype_value_check property_building_type about_price_la_value_check property_wheelchair_accessible diff --git a/spec/models/validations/sales/soft_validations_spec.rb b/spec/models/validations/sales/soft_validations_spec.rb index ae20e1111..f63f6fbcc 100644 --- a/spec/models/validations/sales/soft_validations_spec.rb +++ b/spec/models/validations/sales/soft_validations_spec.rb @@ -938,6 +938,32 @@ RSpec.describe Validations::Sales::SoftValidations do end end end + end + + describe "#percentage_discount_invalid?" do + context "when property type is Flat (1)" do + let(:record) { FactoryBot.build(:sales_log, proptype: 1) } + + context "and discount is under 50%" do + before do + record.discount = 49 + end + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "and discount is over 50%" do + before do + record.discount = 51 + end + + it "returns true" do + expect(record).to be_percentage_discount_invalid + end + end + end context "when it's a discounted ownership" do let(:record) { FactoryBot.build(:sales_log, ownershipsch: 2) } @@ -963,6 +989,30 @@ RSpec.describe Validations::Sales::SoftValidations do end end + context "when property type is masionette or bedsit (2)" do + let(:record) { FactoryBot.build(:sales_log, proptype: 2) } + + context "and discount is under 50%" do + before do + record.discount = 49 + end + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "and discount is over 50%" do + before do + record.discount = 51 + end + + it "returns true" do + expect(record).to be_percentage_discount_invalid + end + end + end + context "when it's a outright sale" do let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3) } @@ -987,6 +1037,30 @@ RSpec.describe Validations::Sales::SoftValidations do end end + context "when property type is House (3)" do + let(:record) { FactoryBot.build(:sales_log, proptype: 3) } + + context "and discount is under 35%" do + before do + record.discount = 34 + end + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "and discount is over 35%" do + before do + record.discount = 36 + end + + it "returns true" do + expect(record).to be_percentage_discount_invalid + end + end + end + context "when ownership is not given" do let(:record) { FactoryBot.build(:sales_log, ownershipsch: 3) } @@ -1095,5 +1169,69 @@ RSpec.describe Validations::Sales::SoftValidations do expect(record).not_to be_buyer2_livein_wrong_for_ownership_type end end + + context "when property type is Bungalow (4)" do + let(:record) { FactoryBot.build(:sales_log, proptype: 4) } + + context "and discount is under 35%" do + before do + record.discount = 34 + end + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "and discount is over 35%" do + before do + record.discount = 36 + end + + it "returns true" do + expect(record).to be_percentage_discount_invalid + end + end + end + + context "when property type is Other (9)" do + let(:record) { FactoryBot.build(:sales_log, proptype: 9) } + + context "and discount is under 35%" do + before do + record.discount = 34 + end + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "and discount is over 35%" do + before do + record.discount = 36 + end + + it "returns true" do + expect(record).to be_percentage_discount_invalid + end + end + end + + context "when discount is not given" do + let(:record) { FactoryBot.build(:sales_log, proptype: 1, discount: nil) } + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end + + context "when property type is not given" do + let(:record) { FactoryBot.build(:sales_log, proptype: nil, discount: 51) } + + it "returns false" do + expect(record).not_to be_percentage_discount_invalid + end + end end end From 7335902122617539f7bba6c2c2b103c3dadb5779 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Fri, 14 Apr 2023 11:27:54 +0100 Subject: [PATCH 06/27] Fix test expectation (#1541) --- .../imports/lettings_logs_import_service_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index 456488493..ccc0e5d11 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -729,11 +729,11 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with(/Removing brent with error: Enter a total charge that is at least £10 per week/) - expect(logger).to receive(:warn).with(/Removing scharge with error: Enter a total charge that is at least £10 per week/) - expect(logger).to receive(:warn).with(/Removing pscharge with error: Enter a total charge that is at least £10 per week/) - expect(logger).to receive(:warn).with(/Removing supcharg with error: Enter a total charge that is at least £10 per week/) - expect(logger).to receive(:warn).with(/Removing tcharge with error: Enter a total charge that is at least £10 per week/) + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing brent with error: Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing scharge with error: Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing pscharge with error: Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing supcharg with error: Enter a total charge that is at least £10.00 per week") + expect(logger).to receive(:warn).with("Log 0ead17cb-1668-442d-898c-0d52879ff592: Removing tcharge with error: Enter a total charge that is at least £10.00 per week") expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end From 2174915fc8a9dda691a2a12f56d6364c5b743db3 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Fri, 14 Apr 2023 11:39:15 +0100 Subject: [PATCH 07/27] CLDC-2223 Bulk upload 23/24 renewal now mandatory (#1536) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2223 - Change how `renewal` works for bulk upload in 2023 compared to 2022 # Changes - `renewal` is mandatory and must be filled in otherwise there is an error - it is no longer inferred from another field and we just use the value from the user --- .../lettings/year2023/row_parser.rb | 3 +-- .../lettings/year2023/row_parser_spec.rb | 22 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/app/services/bulk_upload/lettings/year2023/row_parser.rb b/app/services/bulk_upload/lettings/year2023/row_parser.rb index 175c13400..43b229aa3 100644 --- a/app/services/bulk_upload/lettings/year2023/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2023/row_parser.rb @@ -292,6 +292,7 @@ class BulkUpload::Lettings::Year2023::RowParser validates :field_72, format: { with: /\A\d{1,3}\z|\AR\z/, message: "Age of person 7 must be a number or the letter R" }, allow_blank: true validates :field_76, format: { with: /\A\d{1,3}\z|\AR\z/, message: "Age of person 8 must be a number or the letter R" }, allow_blank: true + validates :field_6, presence: { message: I18n.t("validations.not_answered", question: "property renewal") } validates :field_7, presence: { message: I18n.t("validations.not_answered", question: "tenancy start date (day)") } validates :field_8, presence: { message: I18n.t("validations.not_answered", question: "tenancy start date (month)") } validates :field_9, presence: { message: I18n.t("validations.not_answered", question: "tenancy start date (year)") } @@ -1050,8 +1051,6 @@ private 1 when 2 0 - when nil - rsnvac == 14 ? 1 : 0 else field_6 end diff --git a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb index 8984d9663..37d8e24a5 100644 --- a/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb +++ b/spec/services/bulk_upload/lettings/year2023/row_parser_spec.rb @@ -242,9 +242,9 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do let(:attributes) { { bulk_upload:, field_13: "123" } } it "has errors on setup fields" do - errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute) + errors = parser.errors.select { |e| e.options[:category] == :setup }.map(&:attribute).sort - expect(errors).to eql(%i[field_4 field_5 field_7 field_8 field_9 field_1 field_2]) + expect(errors).to eql(%i[field_1 field_2 field_4 field_5 field_6 field_7 field_8 field_9]) end end @@ -792,7 +792,7 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do end end - describe "#field_6" do + describe "#field_6" do # renewal context "when an unpermitted value" do let(:attributes) { { bulk_upload:, field_6: "3" } } @@ -800,6 +800,14 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do expect(parser.errors[:field_6]).to be_present end end + + context "when blank" do + let(:attributes) { { bulk_upload:, field_1: owning_org.old_visible_id, field_6: "" } } + + it "has errors on the field" do + expect(parser.errors[:field_6]).to include("You must answer property renewal") + end + end end describe "#field_18" do # UPRN @@ -1103,14 +1111,6 @@ RSpec.describe BulkUpload::Lettings::Year2023::RowParser do expect(parser.log.renewal).to eq(0) end end - - context "when field_6 is null but rsnvac/field_27 is 14" do - let(:attributes) { { bulk_upload:, field_6: "", field_27: "14" } } - - it "sets renewal to 1" do - expect(parser.log.renewal).to eq(1) - end - end end describe "#sexN fields" do From c35826313e7ec96ac48cdff76130e0b2c10b2a31 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Mon, 17 Apr 2023 09:14:50 +0100 Subject: [PATCH 08/27] CLDC-2139 Show location details under scheme when inferred (#1460) * feat: display location name and postcode in scheme iff inferred * feat: add tests * refactor: po review * Bump nokogiri (#1530) --------- Co-authored-by: Jack <113976590+bibblobcode@users.noreply.github.com> --- .../form/lettings/questions/scheme_id.rb | 9 +++++ app/models/form/question.rb | 6 ++- .../lettings/questions/address_line1_spec.rb | 2 +- .../form/lettings/questions/scheme_id_spec.rb | 39 +++++++++++++++++++ .../sales/questions/address_line1_spec.rb | 2 +- spec/models/lettings_log_spec.rb | 1 - 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/app/models/form/lettings/questions/scheme_id.rb b/app/models/form/lettings/questions/scheme_id.rb index a9147ba5f..487b1b2c4 100644 --- a/app/models/form/lettings/questions/scheme_id.rb +++ b/app/models/form/lettings/questions/scheme_id.rb @@ -9,6 +9,11 @@ class Form::Lettings::Questions::SchemeId < ::Form::Question @guidance_position = GuidancePosition::BOTTOM @guidance_partial = "scheme_selection" @question_number = 9 + @inferred_answers = { + "location.name": { + "scheme_has_multiple_locations?": false, + }, + } end def answer_options @@ -41,6 +46,10 @@ class Form::Lettings::Questions::SchemeId < ::Form::Question !supported_housing_selected?(lettings_log) end + def get_extra_check_answer_value(lettings_log) + lettings_log.form.get_question("postcode_full", nil).label_from_value(lettings_log.postcode_full) unless lettings_log.scheme_has_multiple_locations? + end + private def supported_housing_selected?(lettings_log) diff --git a/app/models/form/question.rb b/app/models/form/question.rb index 19b9de163..a2196a019 100644 --- a/app/models/form/question.rb +++ b/app/models/form/question.rb @@ -317,7 +317,11 @@ private end def enabled_inferred_answers(inferred_answers, log) - inferred_answers.filter { |_key, value| value.all? { |condition_key, condition_value| log[condition_key] == condition_value } } + inferred_answers.filter do |_attribute, condition| + condition.all? do |condition_key, condition_value| + log.public_send(condition_key) == condition_value + end + end end def inferred_answer_value(log) diff --git a/spec/models/form/lettings/questions/address_line1_spec.rb b/spec/models/form/lettings/questions/address_line1_spec.rb index e2600f0cc..2c13aef48 100644 --- a/spec/models/form/lettings/questions/address_line1_spec.rb +++ b/spec/models/form/lettings/questions/address_line1_spec.rb @@ -64,7 +64,7 @@ RSpec.describe Form::Lettings::Questions::AddressLine1, type: :model do end end - context "when la is present but inferred" do + context "when la is present and inferred" do let(:log) { create(:lettings_log, la: "E09000003") } before do diff --git a/spec/models/form/lettings/questions/scheme_id_spec.rb b/spec/models/form/lettings/questions/scheme_id_spec.rb index 7e88e3139..d16dc89dc 100644 --- a/spec/models/form/lettings/questions/scheme_id_spec.rb +++ b/spec/models/form/lettings/questions/scheme_id_spec.rb @@ -39,6 +39,45 @@ RSpec.describe Form::Lettings::Questions::SchemeId, type: :model do expect(question.derived?).to be false end + it "has the correct inferred_answers" do + expect(question.inferred_answers).to eq({ + "location.name": { + "scheme_has_multiple_locations?": false, + }, + }) + end + + describe "has the correct get_extra_check_answer_value" do + let(:scheme) { create(:scheme) } + + context "when locations are present but not inferred" do + let(:lettings_log) { create(:lettings_log) } + + before do + allow(lettings_log).to receive(:scheme_has_multiple_locations?).and_return(true) + end + + it "returns nil" do + expect(question.get_extra_check_answer_value(lettings_log)).to be_nil + end + end + + context "when location is present and inferred" do + let!(:location) { create(:location, scheme:) } + let!(:lettings_log) { create(:lettings_log, scheme:, location:) } + let(:real_2022_2023_form) { Form.new("config/forms/2022_2023.json") } + + before do + allow(lettings_log).to receive(:scheme_has_multiple_locations?).and_return(false) + allow(lettings_log).to receive(:form).and_return(real_2022_2023_form) + end + + it "returns the postcode" do + expect(question.get_extra_check_answer_value(lettings_log)).to eq(location.postcode) + end + end + end + context "when a user is signed in" do let(:organisation) { FactoryBot.create(:organisation) } let(:organisation_2) { FactoryBot.create(:organisation) } diff --git a/spec/models/form/sales/questions/address_line1_spec.rb b/spec/models/form/sales/questions/address_line1_spec.rb index f037f41cd..8c73feef2 100644 --- a/spec/models/form/sales/questions/address_line1_spec.rb +++ b/spec/models/form/sales/questions/address_line1_spec.rb @@ -64,7 +64,7 @@ RSpec.describe Form::Sales::Questions::AddressLine1, type: :model do end end - context "when la is present but inferred" do + context "when la is present and inferred" do let(:log) { create(:sales_log, la: "E09000003") } before do diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 1e6fd3244..2d349f295 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -7,7 +7,6 @@ RSpec.describe LettingsLog do let(:created_by_user) { create(:user) } let(:owning_organisation) { created_by_user.organisation } let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } - let(:fake_2022_2023_form) { Form.new("spec/fixtures/forms/2022_2023.json") } around do |example| Timecop.freeze(Time.utc(2022, 1, 1)) do From af53a9f0df4a2d8f9a325729167975ab0905937c Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 09:27:51 +0100 Subject: [PATCH 09/27] CLDC-2184 Fix ordering for bulk upload errors by cell (#1544) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2184 - bulk upload error reports were not sorting by cells correctly # Changes - there was an issue where `Z100` would come after `AA100` which is not correct - fix ordering issue above - also made change so this is now delegated to the database rather than sorting in ruby --- .../bulk_upload_error_row_component.rb | 8 +------- ...lk_upload_error_summary_table_component.rb | 4 ++-- app/models/bulk_upload_error.rb | 3 +++ .../show.html.erb | 2 +- .../bulk_upload_error_row_component_spec.rb | 16 --------------- .../show.html.erb_spec.rb | 20 +++++++++++++++++++ 6 files changed, 27 insertions(+), 26 deletions(-) create mode 100644 spec/views/bulk_upload_lettings_results/show.html.erb_spec.rb diff --git a/app/components/bulk_upload_error_row_component.rb b/app/components/bulk_upload_error_row_component.rb index f4f129cbc..887eef10c 100644 --- a/app/components/bulk_upload_error_row_component.rb +++ b/app/components/bulk_upload_error_row_component.rb @@ -2,7 +2,7 @@ class BulkUploadErrorRowComponent < ViewComponent::Base attr_reader :bulk_upload_errors def initialize(bulk_upload_errors:) - @bulk_upload_errors = sorted_errors(bulk_upload_errors) + @bulk_upload_errors = bulk_upload_errors super end @@ -62,10 +62,4 @@ class BulkUploadErrorRowComponent < ViewComponent::Base def sales? bulk_upload.log_type == "sales" end - -private - - def sorted_errors(errors) - errors.sort_by { |e| e.cell.rjust(3, "0") } - end end diff --git a/app/components/bulk_upload_error_summary_table_component.rb b/app/components/bulk_upload_error_summary_table_component.rb index 7b483077f..d15d5280e 100644 --- a/app/components/bulk_upload_error_summary_table_component.rb +++ b/app/components/bulk_upload_error_summary_table_component.rb @@ -16,8 +16,8 @@ class BulkUploadErrorSummaryTableComponent < ViewComponent::Base .bulk_upload_errors .group(:col, :field, :error) .having("count(*) >= ?", display_threshold) + .order_by_col .count - .sort_by { |el| el[0][0].rjust(3, "0") } end def errors? @@ -39,8 +39,8 @@ private .bulk_upload_errors .where(category: "setup") .group(:col, :field, :error) + .order_by_col .count - .sort_by { |el| el[0][0].rjust(3, "0") } end def display_threshold diff --git a/app/models/bulk_upload_error.rb b/app/models/bulk_upload_error.rb index df584b63e..0c298ddf8 100644 --- a/app/models/bulk_upload_error.rb +++ b/app/models/bulk_upload_error.rb @@ -1,3 +1,6 @@ class BulkUploadError < ApplicationRecord belongs_to :bulk_upload + + scope :order_by_cell, -> { order(Arel.sql("LPAD(cell, 10, '0')")) } + scope :order_by_col, -> { order(Arel.sql("LPAD(col, 10, '0')")) } end diff --git a/app/views/bulk_upload_lettings_results/show.html.erb b/app/views/bulk_upload_lettings_results/show.html.erb index 67b01ff9d..dea114e63 100644 --- a/app/views/bulk_upload_lettings_results/show.html.erb +++ b/app/views/bulk_upload_lettings_results/show.html.erb @@ -13,7 +13,7 @@
- <% @bulk_upload.bulk_upload_errors.group_by(&:row).each do |_row, errors_for_row| %> + <% @bulk_upload.bulk_upload_errors.order_by_cell.group_by(&:row).each do |_row, errors_for_row| %> <%= render BulkUploadErrorRowComponent.new(bulk_upload_errors: errors_for_row) %> <% end %>
diff --git a/spec/components/bulk_upload_error_row_component_spec.rb b/spec/components/bulk_upload_error_row_component_spec.rb index 665a630c8..85b2fe522 100644 --- a/spec/components/bulk_upload_error_row_component_spec.rb +++ b/spec/components/bulk_upload_error_row_component_spec.rb @@ -78,22 +78,6 @@ RSpec.describe BulkUploadErrorRowComponent, type: :component do end end - context "when multiple errors for a row" do - subject(:component) { described_class.new(bulk_upload_errors:) } - - let(:bulk_upload_errors) do - [ - build(:bulk_upload_error, cell: "Z1"), - build(:bulk_upload_error, cell: "AB1"), - build(:bulk_upload_error, cell: "A1"), - ] - end - - it "is sorted by cell" do - expect(component.bulk_upload_errors.map(&:cell)).to eql(%w[A1 Z1 AB1]) - end - end - context "when a sales bulk upload" do let(:bulk_upload) { create(:bulk_upload, :sales) } let(:field) { :field_87 } diff --git a/spec/views/bulk_upload_lettings_results/show.html.erb_spec.rb b/spec/views/bulk_upload_lettings_results/show.html.erb_spec.rb new file mode 100644 index 000000000..286e1e279 --- /dev/null +++ b/spec/views/bulk_upload_lettings_results/show.html.erb_spec.rb @@ -0,0 +1,20 @@ +require "rails_helper" + +RSpec.describe "bulk_upload_lettings_results/show.html.erb" do + let(:bulk_upload) { create(:bulk_upload, :lettings) } + + before do + create(:bulk_upload_error, bulk_upload:, cell: "AA100", row: "100", col: "AA") + create(:bulk_upload_error, bulk_upload:, cell: "Z100", row: "100", col: "Z") + end + + it "renders errors ordered by cell" do + assign(:bulk_upload, bulk_upload) + + render + + fragment = Capybara::Node::Simple.new(rendered) + + expect(fragment.find_css("table tbody th").map(&:inner_text)).to eql(%w[Z100 AA100]) + end +end From 61cc81d56437504016f88686f7ad05ecf23fe46b Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 09:28:58 +0100 Subject: [PATCH 10/27] CLDC-2191 Copy changes for bulk upload to use sentence case (#1545) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2191 # Changes - Copy changes to use sentence case in bulk upload areas --- .../lettings/year2022/row_parser.rb | 62 +++++++++---------- .../bulk_upload/sales/year2022/row_parser.rb | 46 +++++++------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/app/services/bulk_upload/lettings/year2022/row_parser.rb b/app/services/bulk_upload/lettings/year2022/row_parser.rb index 998068792..bfb7940ed 100644 --- a/app/services/bulk_upload/lettings/year2022/row_parser.rb +++ b/app/services/bulk_upload/lettings/year2022/row_parser.rb @@ -14,37 +14,37 @@ class BulkUpload::Lettings::Year2022::RowParser field_9: "What is the tenancy type?", field_10: "If 'Other', what is the tenancy type?", field_11: "What is the length of the fixed-term tenancy to the nearest year?", - field_12: "Age of Person 1", - field_13: "Age of Person 2", - field_14: "Age of Person 3", - field_15: "Age of Person 4", - field_16: "Age of Person 5", - field_17: "Age of Person 6", - field_18: "Age of Person 7", - field_19: "Age of Person 8", - field_20: "Gender identity of Person 1", - field_21: "Gender identity of Person 2", - field_22: "Gender identity of Person 3", - field_23: "Gender identity of Person 4", - field_24: "Gender identity of Person 5", - field_25: "Gender identity of Person 6", - field_26: "Gender identity of Person 7", - field_27: "Gender identity of Person 8", - field_28: "Relationship to Person 1 for Person 2", - field_29: "Relationship to Person 1 for Person 3", - field_30: "Relationship to Person 1 for Person 4", - field_31: "Relationship to Person 1 for Person 5", - field_32: "Relationship to Person 1 for Person 6", - field_33: "Relationship to Person 1 for Person 7", - field_34: "Relationship to Person 1 for Person 8", - field_35: "Working situation of Person 1", - field_36: "Working situation of Person 2", - field_37: "Working situation of Person 3", - field_38: "Working situation of Person 4", - field_39: "Working situation of Person 5", - field_40: "Working situation of Person 6", - field_41: "Working situation of Person 7", - field_42: "Working situation of Person 8", + field_12: "Age of person 1", + field_13: "Age of person 2", + field_14: "Age of person 3", + field_15: "Age of person 4", + field_16: "Age of person 5", + field_17: "Age of person 6", + field_18: "Age of person 7", + field_19: "Age of person 8", + field_20: "Gender identity of person 1", + field_21: "Gender identity of person 2", + field_22: "Gender identity of person 3", + field_23: "Gender identity of person 4", + field_24: "Gender identity of person 5", + field_25: "Gender identity of person 6", + field_26: "Gender identity of person 7", + field_27: "Gender identity of person 8", + field_28: "Relationship to person 1 for person 2", + field_29: "Relationship to person 1 for person 3", + field_30: "Relationship to person 1 for person 4", + field_31: "Relationship to person 1 for person 5", + field_32: "Relationship to person 1 for person 6", + field_33: "Relationship to person 1 for person 7", + field_34: "Relationship to person 1 for person 8", + field_35: "Working situation of person 1", + field_36: "Working situation of person 2", + field_37: "Working situation of person 3", + field_38: "Working situation of person 4", + field_39: "Working situation of person 5", + field_40: "Working situation of person 6", + field_41: "Working situation of person 7", + field_42: "Working situation of person 8", field_43: "What is the lead tenant's ethnic group?", field_44: "What is the lead tenant's nationality?", field_45: "Does anybody in the household have links to the UK armed forces?", diff --git a/app/services/bulk_upload/sales/year2022/row_parser.rb b/app/services/bulk_upload/sales/year2022/row_parser.rb index 965c3547a..6f38654e6 100644 --- a/app/services/bulk_upload/sales/year2022/row_parser.rb +++ b/app/services/bulk_upload/sales/year2022/row_parser.rb @@ -9,29 +9,29 @@ class BulkUpload::Sales::Year2022::RowParser field_4: "What is the year of the sale completion date? - YY", field_5: "This question has been removed", field_6: "Was the buyer interviewed for any of the answers you will provide on this log?", - field_7: "Age of Buyer 1", - field_8: "Age of Person 2", - field_9: "Age of Person 3", - field_10: "Age of Person 4", - field_11: "Age of Person 5", - field_12: "Age of Person 6", - field_13: "Gender identity of Buyer 1", - field_14: "Gender identity of Person 2", - field_15: "Gender identity of Person 3", - field_16: "Gender identity of Person 4", - field_17: "Gender identity of Person 5", - field_18: "Gender identity of Person 6", - field_19: "Relationship to Buyer 1 for Person 2", - field_20: "Relationship to Buyer 1 for Person 3", - field_21: "Relationship to Buyer 1 for Person 4", - field_22: "Relationship to Buyer 1 for Person 5", - field_23: "Relationship to Buyer 1 for Person 6", - field_24: "Working situation of Buyer 1", - field_25: "Working situation of Person 2", - field_26: "Working situation of Person 3", - field_27: "Working situation of Person 4", - field_28: "Working situation of Person 5", - field_29: "Working situation of Person 6", + field_7: "Age of buyer 1", + field_8: "Age of person 2", + field_9: "Age of person 3", + field_10: "Age of person 4", + field_11: "Age of person 5", + field_12: "Age of person 6", + field_13: "Gender identity of buyer 1", + field_14: "Gender identity of person 2", + field_15: "Gender identity of person 3", + field_16: "Gender identity of person 4", + field_17: "Gender identity of person 5", + field_18: "Gender identity of person 6", + field_19: "Relationship to buyer 1 for person 2", + field_20: "Relationship to buyer 1 for person 3", + field_21: "Relationship to buyer 1 for person 4", + field_22: "Relationship to buyer 1 for person 5", + field_23: "Relationship to buyer 1 for person 6", + field_24: "Working situation of buyer 1", + field_25: "Working situation of person 2", + field_26: "Working situation of person 3", + field_27: "Working situation of person 4", + field_28: "Working situation of person 5", + field_29: "Working situation of person 6", field_30: "What is buyer 1's ethnic group?", field_31: "What is buyer 1's nationality?", field_32: "What is buyer 1's gross annual income?", From aeef81c3ad5ca60d19dc08fd6314a38463ff8e41 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Mon, 17 Apr 2023 09:39:33 +0100 Subject: [PATCH 11/27] CLDC-2011 Update income hard validation messages (#1534) * feat: change inequality to be inclusive in error message * feat: remove .00s * feat: grammar --- config/locales/en.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index f0b52ce9f..074a00147 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -253,10 +253,10 @@ en: freq_missing: "Select how often the household receives income" earnings_missing: "Enter how much income the household has in total" income: - over_hard_max_for_london: "Income must not exceed £90,000.00 for properties within London local authorities" - over_hard_max_for_outside_london: "Income must not exceed £80,000.00 for properties outside London local authorities" - combined_over_hard_max_for_london: "Combined income must not exceed £90,000.00 for properties within London local authorities" - combined_over_hard_max_for_outside_london: "Combined income must not exceed £80,000.00 for properties outside London local authorities" + over_hard_max_for_london: "Income must be £90,000 or lower for properties within a London local authority" + over_hard_max_for_outside_london: "Income must be £80,000 or lower for properties outside London local authority" + combined_over_hard_max_for_london: "Combined income must be £90,000 or lower for properties within a London local authority" + combined_over_hard_max_for_outside_london: "Combined income must be £80,000 or lower for properties outside London local authorities" child_has_income: "Child's income must be £0" negative_currency: "Enter an amount above 0" rent: From a2c0dd3e66371ed14962235e9da672024305eb1a Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 10:18:23 +0100 Subject: [PATCH 12/27] CLDC-2201 Add copy to explain username bulk upload field (#1542) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2201 - Add copy to explain that the `username` field in new core accepts an email which differs from old core # Changes - Add copy to lettings and sales `Prepare your file` pages --- .../bulk_upload_lettings_logs/forms/prepare_your_file.html.erb | 1 + .../bulk_upload_sales_logs/forms/prepare_your_file.html.erb | 1 + 2 files changed, 2 insertions(+) diff --git a/app/views/bulk_upload_lettings_logs/forms/prepare_your_file.html.erb b/app/views/bulk_upload_lettings_logs/forms/prepare_your_file.html.erb index 56b8dff90..45c2be562 100644 --- a/app/views/bulk_upload_lettings_logs/forms/prepare_your_file.html.erb +++ b/app/views/bulk_upload_lettings_logs/forms/prepare_your_file.html.erb @@ -19,6 +19,7 @@

Create your file

  • Fill in the template with CORE data from your housing management system according to the <%= govuk_link_to "Lettings #{@form.year_combo} Bulk Upload Specification", @form.specification_path %>
  • +
  • Username field: To assign a log to someone else, enter the email address they use to log into CORE
  • If you have to manually enter large volumes of data into the bulk upload template, we recommend creating logs directly in the service instead. <%= govuk_link_to "Find out more about exporting your data", bulk_upload_lettings_log_path(id: "guidance", form: { year: @form.year }) %>
diff --git a/app/views/bulk_upload_sales_logs/forms/prepare_your_file.html.erb b/app/views/bulk_upload_sales_logs/forms/prepare_your_file.html.erb index ad1449d3c..71e759306 100644 --- a/app/views/bulk_upload_sales_logs/forms/prepare_your_file.html.erb +++ b/app/views/bulk_upload_sales_logs/forms/prepare_your_file.html.erb @@ -19,6 +19,7 @@

Create your file

  • Fill in the template with CORE data from your housing management system according to the <%= govuk_link_to "Sales #{@form.year_combo} Bulk Upload Specification", @form.specification_path %>
  • +
  • Username field: To assign a log to someone else, enter the email address they use to log into CORE
  • If you have to manually enter large volumes of data into the bulk upload template, we recommend creating logs directly in the service instead. <%= govuk_link_to "Find out more about exporting your data", bulk_upload_sales_log_path(id: "guidance", form: { year: @form.year }) %>
From 9199052dd97c639773af82a6871bc66415fc7f5e Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 11:45:47 +0100 Subject: [PATCH 13/27] CLDC-2233 Update bulk upload assets (#1543) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2233 # Changes - Update bulk upload assets to contain new content such the new weekly for 53 weeks options for period - This affects the template and specification assets for 23/24 --- ...upload-lettings-specification-2023-24.xlsx | Bin 132568 -> 89671 bytes ...bulk-upload-lettings-template-2023-24.xlsx | Bin 398839 -> 14978 bytes ...lk-upload-sales-specification-2023-24.xlsx | Bin 59860 -> 38163 bytes .../bulk-upload-sales-template-2023-24.xlsx | Bin 394662 -> 293917 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/public/files/bulk-upload-lettings-specification-2023-24.xlsx b/public/files/bulk-upload-lettings-specification-2023-24.xlsx index 819fdaee06391a5117cae237e7930079b4249148..6d964c8dd3b5412e76491313384f8abb5742f23b 100644 GIT binary patch literal 89671 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 VM@G3v$GH2X-brDS{$1+8{R@rfgIWLp literal 132568 zcmeFYby!sW_BO7fC`cH9AZ37nboZbjF{B{f9nv*4s0b+C9ZKiWLxX~Jj5Nd0T|@T} zzm3mxzTb1sdk#M5{Qi7juFHYzv-e(meb&0yecyY7uca`q6I{W(a_h>KE03?dV6{|^ zxO(MEH|CWq_pjW#rXgZ&qktIPn)cca_6S3W zdlgHyv-i6WL_E35Q{{J-iHZ>Q(#0&~b|RrfqvY2lpLoWri21oq-IKE2ccOtX)zaWL z9h+d8n_{~20wX;A)w1D0 zTe|99uiTSSRtWq%LU;v!Zw@+@Lqql|+eRV&F)=`4)!{CaRQix=a1>VO6N_u2g(* zmOn#I1|Pn<^zE6<3XPkVPQKga(J0Hk1d}r_d?ls4t24qQLw}0P=_r z6wcX#*~!|@T;JN-{6Y)Ul`XB)cbK zlEN(MWO5U2+j(mKxEPnSdTfTJ!J&BFctj!ojk%$(-(de*kOmelSdhk6e%3x%*0X~d%#B7{Fj)n73k z;PtpC1i9NHPB)UgFeN}m2|n(S#>Lle-}Kh@xtYI-i&N7OHwzwoWP& zhGna2Uf&2SBg$WiRT9}veL`07d5lr2dRCF?y`9k;*6wU|X!B}`%S(@@Y^S{ClmHT& zaZ;XS>+Z)2?N^q_^V-dBpI$2j8~6D?iqfhaKVB>o9$;Ika?8rNv6?VPwBjVE{Wbnu zocrV&_iJeHHu}+zr-3vvJ>R6RwNkc>eD>DEX|jlR#t`@>a)OZ>suzjXx15->De~p4IB;`KR^9k5E_3l}kn|6SJnJYc6J2_YgBe|d8gD81 z)|*5=P`yJE51t2&MBhu6AMFlA>6u&$L3b^2XI8u)e7{vL_a>Ee=~2Hx0a+aD_yz@+ z%6JQC_bHxuz>kk5UdQJ+8`D8;%W*BsvvI!tg*$#naj=R~zxg+=&@Dp>nur|~O+fP; zvT1GO?AC4ymgsAH)4BTX?DP9Jr_BFSwIB6(;O(4zREVUgL1v_}B^rfujUL9IC434!X~ zC)5B>hZiRFlz!2#o#K=~xIU#6q<-86F%`}zla<2$n)fAQ`%!dN}{f1~^ zn+j&-#CeYgiRZ&GBLuBGY$dz*=Z)K&0~OO(8DgNq_fEKjuRZna+z*i&%}b-n6Z(LZ zxFgD9{Ppob9&fw@_#w7P?gCuBzS?Be#yBhNg1(O}1ocP0; zaj5Ro)Py%ue$Av+o2=3gOykeYaT8B*5f@DTe{y*T+Qc=)|LT=Y$n7h{z!`sXxxJ~8 zk%K++uWzguq@Eawv_f9g^X3{k&iHT^m8|&>IvAuGdo9(}=^GPaob1PyDX?9H!$?g? zI4WJlufR044NKJX1T3$XxRL&e;+rZ|NwkEA`YvszIdq8dX!~eoF7nloywaPmgo=jv z(TU8H^=cO7RTZRH9z1@D@V7`b@1!cWzz82zt@vV-)hnjpC)CYXTyRz0?-5W`W zT2S_t{=MTy37t`I&lG69}ueWetze-r3oPhnIdV!B}=VWo|U=|M3mu z;HLAd`ND|EZoK@HTM4!Il*x4KwKCV7wZc-CH~GGsEX3?q2D&x0+1*{3Yhid$ZU2G3 zk~IuPMKN+Fc&o19R`7~$<@{>Uj;~>r1fDHt>)kEO&o~@}E-_J)rDkDnSyMYvO+%m~ z3f}5!jH_K&SGpwT#N9LY>YQrD-uUOL=RO*pEa##9-nzVhpJV;n$8Q89935m{??@f; z+9dh2GA8k3+P>zn9^X~`c}Ky;CHW}J9-mhj6;l7P_T&UP)z-LGP2~5#e==G0Ysf!{(IuJSTYHrV zcgK~!z4iziHg~pxVU0V!SI1A)wIEVY!T+435&dFK<*C^cF4Y+xa3E}!r-pcjxjExSUWk#%)b?#{{1h8G%D z;pKk1Ds*-nBXr){aN3Y^HoNHL=OlD`w&8V(-Z<9rszz_FXEmGx%T6g1r@K0Sehp{G zSzf0bg$<`?tJYo*>d(DBPk_s-Eq9rb%9F4`e9xG(MV*QBqmc6>V0~-2Xy&#GSs$UC zrfm%Lu!Hbm+1~`}ETKYnKH&@nZwe4u2<0ch%Mh7=&Ch{H<2Urxeu*5@ zuUF45mYm3s^8*$2sZU%VDO3@L^7K5YOvzu9J2pC>7Qb=m3gbImeyd~ulXthIMNV~i ze>N+BGhiw9xSCSP2ql&3{@Y$s9W6DiB``Vu3O(JwI=>jBMS&l)I;w@YrL(W=HCi~b zLSi>YeZ2D*T6p5h>E55>g=9M2*|>Lp7L5?DEp zIMd%JK4MJw-VMFVCj6`oN9~b0gPAH)6E{sotMN>Cw>o5YCeI&ZiSFlqh|YEi{Yasn zyaUK}0UG>%hGE}p;|a5B#7jGgt8|YE(|tKY@2C4Xgi^4*5No?0_xQG95OudcY2|om zGbl@{8##}0=dPPQCQtXn z3BAkq(zxxKngO_UWWkKvusCEooZ*EWa*w8@Xt+eDDV6H>+6u99v)ZBQ<_&W;2|T(- z)af4vLNV<=l!fB;iD0(fihIOv_&&clUCpAul(b~T&k9WRB@0zepmuopgh8_88#Gu? zDbWZ2noiL(@43)x3c}ANaLpdkNZek2Bxv|9FcgbTgsAPIRD3fRR?Xu8k9X0AS6%tm zB9mWP=OnoKuUKge%?#GC#uG89`u z>UKFOn}h99~@ZpU?|gM`1@&D7wFXNJOn?^ZKE3v!3p2e@+rAKZ4ME3NPPEVDP?Fm$!H@s&GRcFssuX90*AE>`3UW_2JIDrk=?nY+O)$=cFiw` zntL%tN)GUwRF_WPU^#d-p=9)C5*l{}VtiEM5y)P5b&u}#y}K>6Xyf)EGf#dJCl4F~ z%Fir5&6l^3Z8)>YTGE*E!@Bqr^u}4I7IB)ktd89Ka6=Y-1b0A$OVNWd_}Cun>qMMq zWtZ<6yl^(euhw9B=t`64Rkq%F)Y_gxNjWyQSc?o|INvGA*OO~Ec}uZoapZosI3p-H zQoKP-Bx?3j`_ZM{D1*wlOzxWL_PA`gaGQUjN_O*lOi0vhuieM`nhbNH_VT1~XGaqc zWb`&YhukLM4{33mbie>Z5Tl___0``lgU4bs+|^iIA;ttap(kcB&V0^=4^G^Ljp)4%Ck5z*yyrZ>iy zUxy!o*fhlw(0FpfQ!jZm#az+^g4Gl?*hiIYEZ6n|y!#a9Bc{{eoxkG^a^>oJqeuHo;@`H)li9u!{fEh6ef)x45Tc0V?!B~=Nu!UZA#+F-GFx8alRLcQP_ z_A#ACXd3sm%kh$LRa3DK8oNWvKHW;WS5bSCfolHwMm19N7v42t~`_AEFX_dN~xR^8L(9C($87o~pAIxc#lF*N+dkwh0nmw0~afW%g)F zJ$wb3K+oUhZG9n69Qr`wa#$hP;T|J?nIR!)d$Lo6>LO*U^(&!Ky=7qgAv~UY_lc;P zVU(wJ8AY_!Dl^2iJ-6(&e}D$%n~od z@tt#fO4Q5}F;TOT-s`~2L01CB^{?PRu0MaD=I7D)uzEY8xk;{Kymn}_H$~Ia@h%k7 zSl85^d;*Fu$||Gx`skuc;N(NcdO4PAs=25=`|p}l_WG8bJZtbf&1%29n$}Q>9{^kA z)7)-yVUkX3@cMxrFoTAGMt_Z$CQ(b*<>SS;I>fru1e!gKJYhYBH0-1o9G|n%z;Ih14v=e&;02cuGi)%K02s%IzZ$E`o)@mu%O%a4M?mK z){=EguiI(T=C=8alOE_O?0Np@_z$%&E;Xq#MR)=N^Q933*obBk! zlvCl=TH30Y-zM8UPPOXo^Rdlmpe%T;m&={XaLaUv^e*w^zS(8Vk z5X#1apSG&71-g6$C>)XlPsy{>CTQ3>KtR7G!_U=saWUV|U=a8&UJk_WrO{1yewni= z{kN0?eoYY#bftA8lOUUi2k!%NSgM1q!%qYAay;a>c^BYk$ZP zTi=|J4F#Mr^!ASZ62|EC zz@&Vf6dt>##TQ$Q=I>|N+^tSO{4Rt{&ZMH4vxL}gU2yex9HWnFHUibWwFlzZ7h#U; z;FD@zI0P~8!M~w`4(Hmvmn4&1(hb|Juid+D8Mfkh;r{re64^Lyw=W$}pb$Iy9{KP> z_G{EeYkB!N=OcXF?hET7z#dq(e&g&&DnLuZlzy8VSh%~a)e$tW)qRCNFVg?*dYhXZ zmy=j$V8;}o`M+hu9)@dM7EBm;JGMI!Ps4UQw zlusW$fS*Xk9B}f0;)?#RxWk#*LT9hKpPFR94`+gQzs3jQW05}7`j`+s`_xxX+6xOQ zdO&tLwP}s!*cS!BRK}O{lE>d@TT9<#-=~-~ z*&%u#9_o0k8=Bmc7HK4J*czl+B8E_=fLUH%z73$iX=_{L@2%qsypSwOUoibch~M|I zop^2)>M6PZctnmNYV_ha_MFYiZQ{rN$xXKuuGf9ddYgzom|-?9j3(&oq1n7y01QOzU`NMAF- zZQ^K*-6GcEdzFbQq0{>+n#-pU!1{VlgAi1Z_W&nvO>@Q`Ui6&K`{I)c!(Q%k8jiMI z9Zz$;{-om;_xqOCUnJ=63!vO)n?$+UXlh;lcb8jkANksYW8K8$ye25>tCOTs{fse7 z=zJ${5-Bh5e;9UB0k^)eeNgE{aJg~O8gt!PYGsMXp(NYCS@x0Ada~; z8at>n*X?|5(?zFUhWy~HXrhyuU{Z93+cELHc^K2{{pALM%EhC4&#Vq0*pwksTF~Zo z$z(Q2<$U-}{qAUezeIlV>_Jb|<3kVVQ>{U?0shxgr@ayPvC zT~y0Fo;)3m8t2$`Kk`UbIy^L1B^>s7{2Pi|t=@Y!BuCa1o_sCiXbc@-Vs$9Zhw0z> zO(y?xeq@{-N>CNDy(8s{ZD@4(zt`br|Mt3^L!M!oE;MSIIi+fveVLe+2_sGQci32^g}7aVj$^)X#V+$WFm<@G!i{I!WYV`) zTi8jj^Lt@S8$tCx(#Bk(%a`nQ-fYJ@*pucAXkeOwM#%Nm>_Ui zATqXjp&KbOEP&GI)zrkmX< zsQBuMd>!I5o@E45Kes!xWt(x`G*eUEI}OqH6-9pAuq&9se}f+|BQAX1KbZA5&w*v> zNGpxgE~GNhwm$A_lqUw!dQt12Ts@wKq5-(neEad+$>L)@?Fu=K0C2W3AaMADBfpPa zK8B4YR1kQ*K@uDL+xF9BrbL9CqDf&ojUg3a)cnUS-L$@}qLrJA$)`G_6L^O`RW~ul z3`Sfu?>+k+c9(~+R!wA8F+^#?vRF~%BxAV z6Nx(>cgM4rE2JB%=h1ERQ%2B6qj+n z!PBlBt4HGt9w1fV<*&AoUN$LFGk3M^A4OaFZPEOyQx4w0(EOP4Ea+n^&X3j` zDf1qJ)(^<}PwYRy^<>yGc9z$f^?Iq(E`KpW_0Z$IDF{wJQgL!Le%4LoDK{Fk6Ea(4 z3XiU}X&hL0>^#ih`3{#^RNC_CL8Ly#TlR?zvr~Ba988$=j5Gay4z*)?GDoOb->Z1= zZ8MoR*J`ePkHcL*6y~YdHa+{EBjMI8*~Te7Q;(3`#_9Q#_4C9S1YsC{fX>1GxK!$r z({YcJUy=&-WBu$dCG1`mx>qzlOX+u#2vQ@29TYyvV)ud{^ZlzuF~i3bd?rIG2~$TU zCIRpdCg`(_J{KkTg56{0R~z=pj9|=uW2gdKy<|HN9SIHfY`S4$WMD+Ntpb~@WDEFT zEIxZ8wJ>zGtbTDpgKhd=M+(2&nXNj!9=x4lU-`*(eA`V$eo=JGXaEtO$YQtfe10x3 zG9tpxPC-_-qaDo4OGiU9KbM}E_^%e9lq6au2~$pNuus*n+}ecKCV3@mYxpcOQ$3g$ zX!p6vO*O2%zdo|#a=u(11<&x}We$LLfw4Qd6<^C@cYt5=($Uh~m{0$bNDvwE!A{{{ zEc&;7sCIPqaBhGHSCD>Sib%w-{es<@+M3;9hTA|S90u>K zKgX)v$wld@^!A)Ulb4*T8A^55oV6nr{oZq{Dpw^|dI*D4eq!)U%}))ZSZM;P%7ke*qf5BFBAVh|{2% z@H?mtIkM=z?MQCa*hCY~{q3X)Uj?SfHmxI}J!1g#(2mv=M*roY05b2($9L^hp38(F z1l^I_dzdEY*SlhdQ}TwEuv;i!*=a{>;|V^=*(}Tmx&Cebr;8GqTG8Rk&0V`QPNqCI z1=;5k)HzQE(|sMDl&1#|L}2zw#7nT7JubjfGeo}Lo;*Kx@~B?f%(DEp!%esqO~Xim zhvs4TytPQ^#)rgb%B`wcq<7;7#-&BP;9t+hKbQ4y6ZFck-9n@t8IEX;Gh<_+E(M~+ zHszXHOJcgcVFRh0`lK7WM_n>+{~Q-+7XmY+g1R(>A#E#JRtE@~pgmug+-t)<8-=Tc z1Ig5PcgWRGR1A#pw^d-3ecl3Y=E)(ZA)HOWWbt#GKjK+{cGv#;vKKkU+3{-1*4R6A|t+xl4%zNfD{`3J$XVJ>XtmIzAfF#q@u- zsP&3yoGZQ-#Zr#X+0RZY?Uys|>A?Dtaqy0GD_sh7g=hY^Wc3fllYSN5#ig=q=y`(E z+oYEwp85S7L6;TeQKOsDSd#zub;UqAF{S^gYCwJOs<9$fw_x5~pit?A_c?Ln`6TC> z(=KYRr-9=+B$Pq9e}Ovwflr>47{jV&EW6k4x0jK`#$!cD8IfwWAF_}3boLn+@pI0W z%Kw&&{vlxEfb^@OE-uyDf;bPVI4+Dg>@^76mXryIb~KmwMUKJ$d5)3^h-7^)4faWx zbi*j>1u!EXu8CXl5G};+kw3YPlatFF_HQIG9)an@O>VNjf7gHw`86lbBZ=H((~6c` ziT#jfAP}G5>v0Z=PR8Y&`w#oPC>(eiw=jNvA8Xb#A;b%Fv-9x@4=>Dp7oR*?Wtn<> zH7a;gdw;LiG~t7eG9pLD1=RpgYEg~J%M9U?QLqKkE7{6E?*TXS=J3!EE~d{UDketw z+bdkMC~DYj8PS3aRzL@`2{3k8yD2+NFY@Jx;f`d#zFF*{c6>E7K?ByON#vc_sD=5ZR6%FoKtkpT=l0eJwFEDdLhvrYD_N37ivlUyvq|?bL_+ z?I)IH9!KiJO63|374>*pdi6Of5%Qsxw(&J@SV4?Re|7Z#MiQ?Kn=R5>H2e|bk;}~k zR_&I;NDH>p+$V(hTM}FuNeB&?&m3V*z?9%i{Z~_xy#;%N1f>h4jGoL6-1NwvMc$Of|EHRQ>G+H)4kgMF7t>r$gxN{@mK%}QZag5W-0XHDLGzqS#^fltSgMyE2 z?oTiwUyd-1(o#BhlH$Kx3~YNo))G=dUbX+-$WF-v|BXsbhKhvqGKDhm8xTGll!jPl zM3UTV$0@tN?7V(i1i()lCkRbMcY&&;nL~9YjVq`~Jf%VTlF9O-fI$#e`gcbBAGGc7 zEc=DwC>4=g@YYT|onj|LcE9Y+!42`m5|W#gJT;6k+$-B?k+l@SM0NI6?V2PIFBcJb z(viQ>fxiiE;klmj0c^2HZ4qb1NES5LD(qmg2Dh?-=GhJlhFz<-AkJ>Z>8rSVBpW-8d0$ zz6n1pQXA129jRY#LN9^ZiuP*GJABfaWngLC2=!{bp3HNM|C@JGbePh@iJ$0 zCGj#Bbp7!%S9Cj=xK^!5^(G+sqkbvNMu%2gG45nAm1v|mdbV`vebzS*C07!>e$GKF zGcgvU>u>(@M{x$p@`kN}*d(mX#i@uYO*i^3$cHGJn!GpIPZum+7DK;ULLaSDJmVjw zl3%UAM`#WmS@thi$*<8rB_xH8I5%g~bLkY%`xoS>i6hf@GMjpvKu=}x#J~3i?>i3N z1;r6@$?%VI%gCDRX^r;QGw~MKCh;}$IbMGw&hq<@Vj$@54lH=T%51dP%1pdQO*~c| zwAR@dtjkA%iiTY8-@26M#deugPeog^2e?;mx_~88TL2jh4+eVhWO`wB*m?QVRCEZceoAKOrvZQ84Iv zh)Xtor^ukO8?uJ$Ve6n(X*OJ%-#lUlWwrSAZ5pk<3pXpvLy=bopGD@soeE_#^rAC#hVAwRg(l`CIRlRkH`YXe~?{R5Y3^Rb5;5l=S4E8j!&QzlO1L zu=$F${A?qBNFwsoz|;^Y=-({L!(XLQAMx6Vj(w$)NqglZ`WgH7J(-ZThaG&HW!Vlv zM1(|)Y`&r`MQy}HBu!5YR1I+g0`SIM1yus~J6p^13CLxrG(QV7WyV4P&`Q6jflk#S|T2 zp+k#8u+Wi3a4d9qQ6UyOx@ZFneK*dzjEcuESbUM1^I@=flxT<~|5jVcbh-I%wgc|! z+9;E&VVuT)mZISOkm&1+vEo2P!RHLFim?~@?esCY8V1gW8JVR}*e&G_r(&@jr<4>z)JbTc+)D!7hqy3B73mI($BhE6<{8IRY*MNtMj} z4j%uU_^<8G1KTYp`P+6?n3H1uY_IZvR=bwXY?GPZ@Kmy$Y%1;Q@+H4ysG z{5nhjtNaKq@~irv{EpV218Wq9G`=&hkH{Fzgw2`e=p zcHbX;vyF)InUy#C6|ZzEtTf9c%10o*bP-(h0Lv||NCnF+sfZiPEuqK>%Ppk{9}68@ zB!`7gEMmq&#}`>+p_7X!!vMbZw_9@l!Cg=0*0_~jvLtUtL!kz$fdo-RL8qM+k)k0C z2mY5Z%RfWsUv&F^2t!Kud?gHI*Rs{No&R5v4P6I7Hg@cPBb#l+gA9_6ius}c|LxAN z3tqKg+J}WpMKQv0Yis6Q`AXd(mcH9b;zpG{jQ>5Da>Z#B^D1d`WW>(q7rjpGLU(uf z)X+lw%{>%uBd(S(rmI{h@ho&z>;x_7r2N zw+FX;GhJH<{BUDcYkK-|B}6*|wj%bFY1EVq&LG#h)%9B;`v=Jbv{+2a-(ET`oGb`X zz_i9j`?$>Z?dftrgM6EwcJ}{wQ+q+8yblEdwE{>g8ov;bATBas#)$r_8RHpDo6jLS zuRZ^~{s7?S3z_x#EErhgtM{+zErjh%Ai12RQ0#THakT_SY14RD?E)-HnWc5 zz&BHC=<`-TS4-LL2stDSvs~?@3_Wc)+IcLT>Cq^;YpWLh159er=hL2UNxjmvrFPKN z4A$AFPw}HIfkgU*lqQsR7>>d=x1bdT=0}ExqaI&8ewIb>xS0i-J$Tj+<5|^;+lM69 zt<72_?PK}pkMEYsez35th%82V1``>2@I0#{H)KXXLVtl*i+wxuPjf8VR6fj?;y=n~ zY;#q~9B=qY+jkRjQ>Nw>V$-{p<04NpBo^65$FDR!KDh&TyX6x1strhk=t&)YKTrX) zgU8!1`=Qf$LRt{BK)ITtFZ$SIASl{?2*h4FP8x}KI~35e zG>z5bUnz@V(LlDBp?+>Ov7%5cZc!f*5majYY^XEcIUwOzoz5&JPaA-YIeVamcf3M7 z?GrGELd>}-rnK-yOZ@9V=I7!)>r;9r{{6<)&F+0-x8=f9b`M*T`AFk4GM(KM9&VRK za5hL!%^~XgN=LQS(?i$_?8uo8ZzCENQ5YcUO zQK=gOl)+}!t;>16Jav!(GaB1!ScI9|H>nv1=g*I@_Lf={@G}eo$*^k7*3R0(c58#A zjRlD_v&5-=VIyBdur1DGbjm@wb(}TlD&y+S0f9Yx@~H8|W1T%QF4nP1KvdqG@x5>Z`agDPK$4)%tLN`6lJ&& zJ{`NiknHNpL69rOom94wtx=QIrO8GXF)=1D7lJ9`xSZX;9`U2$Y})JWM4W)mf`&Z? zrxk$YoGJ&gah5oR@%@&vQo)`4t>?=fW!z0`yR=xP=)9^v86k80l7ewrVK^iPc8$aUI0Jv!}^&#c2Ey6^wT+3Q>-ruzuf$P4gzunP=A_~WXE z@`V`h#!0(z2s16-jOni&mo>73^sB1&X_^`{Ew}sCRgok|Bk2di-muwc%-Ztj%N1Fk zhe*ZW?(Ql#2ClDBsS#oymdVxV*R-(k%bJgVS3K!w{i##;7%jmz933a+x*cSB6G2VQ z!euU}DYvT2x7ud~?9{<%6sfmw!O;aJ-&0BYh!_PHxsPn5-T1qbgM1O?X|hOR=7tpx z&H^Au28uvf(;8yRDw@tV4XZXcm2@=X`DRJ~o_C@P#_Cbu@HB>Rr zy!3|;9c92@Kt_F>R0msDbrJ?Jz;`o7DvN^aaAKq&jcT4X2l0U<9LsJ zwB`2B?`?9h567d{rjY^TDRJiBj0bnggn|Qty2dzytbB)qbJa>nps2YzGh=AiQyeGK zICq0IJy*%bGWJ(eO=T#DT42(H`#YKSXk`n@_xfdFP31sqt+oO5KoXP1W_L&Bql9bMN~3v`%pT(Qo43xgDW}|1#5~)foL8}otK#dLD6Ga@EArp# z8ncx>Ej;GoJaP&2J#L3H+uu#o4sCf5ov4#6z`m$;)B-yg=wC{9MP&L z7UQeh{R~EtZYwSha&?eMGya-sZ>@&+bzO;0b(UHY_q+N9h;oOm_?8XDwU8*I1$Tgc zU0hw%nd&L{K0pB&dXlTSTxA->k@|v|iNbF!tFZ6c`Fp}*)c)1xMFIRIvg9Ek5Y?>a z-vW^vF7`gExftY^Fc`A4>(`lWOeu}A2-sF#^3Zofd>w?gaZe2!3e~-NjI;m#wr|$) z=Kh&N!$;dqDf=GRZq2?ZGiz(#VH0P38GZ!L@XZfSx9?{rS@;UFFAB!(?HfCL7?yP% zr*~<33^^e2%)#C{XFAawu3sh1VKH&$g|LV?e%aiBmXHucXJzK}L~ik9>!`fvP>)q+ z2V}^6Vh6U@^odybB5n|JhC`Yj)g$p z9(;+pL-of&N|Ij(rTMW+quR49<9GoHs%Tm}e%JohY?yW=OJ=42dDHjolBBN03#FlN z!?#=Ovhu*u7bIAI92Qci{gP0@Dg;IKaU)s>SZO4L4>V>;#^etJt((mCL*ZE1LT^o^`9Jq-iqfgj!i=XA zWr<}o1*^%SAsJXg<|fiL#+3kry2ydnQ1`o5OQn55YxhKuh3bVB$txlXb1Ifc`=b_% zDq0#SEq0ZJW_R>#fjj#6Fz9PVG8J^SRG_gjmklwGpuRd0Wo_XmR|i7rnU1z&EgUa> z;z9LU{n3~GWLJ;MZ-B}RI(jI)OoW(K#Ki4DrQLw@hf2H-k5i++h4`h;?b=yh9GH&X z-4BkBAxEYZkQ;d|1d7PV+rt3(1B}JHST1`I`UD(XAli`jBxC$fD6){g{WQ$t*7%l* z?h%N$#?0d4w$`&Ytm*}vpTt3{>a{$vs6aE5glPoKWa1BehF6I6%W^f9ds@9tFS(d5 zAbi4fdE*L@X15LF@WU*v(e^UNU$_E5%echLfih&*%=7l`wlUf|sk|Yv(Vkzy-DJKe z9=8XMt5WAGVKm!aNdARpNJ%jlFh1ofNT7){gByyl9xf>LZ9hOwJBE(^?n{1YK_o6&nvK)K51u-IKd*rlo#XLD*MaF|!pp z*t=b$wh`}>GCi++>{Ou4>F`>Dt4SL#z+2d^ynM2IG~UtgWia+d)!z+X>H$=t^BI2x3e-_SUrM0GwH`N6?+UppMO((nRrE0!M4&TGDu&X84XP=KBPM_ z#P=zZCU*F(l1OkQ@ux{ zQm2uevO(hJN(S~A#o4!7r5NYxTW?KA z!Lc&Awlcu!0V-fl=n!Yp{=FNN_17(6p*(*qx+xb$N^&l?z zLC(#MT|iyJ{B2a>F?CRB!VsYE03K%Pe~3Vo#a99PWwaZN=78ACoi;F-tr;3<8+Trl zcPmc?VsA{>G5`D%{Oc8q`-E zcXW`hE(5012ddY%V@h7ox3ykhal1~U_EhIu@`9H}DY_6^JuKuG8i?B9eQ`+s}gKoDHzk0_*Sw| z$mtCU;Wu&LI5%_|0c?u81k=Pc$w95zcmO0LGq?3XQ^?ZcJ7SWnhXE_KyJf30?SBf3V$ z>YvX4w)?_FFL#sg)tqekr z?&JkH?;y1U4RhW=s)T947~2oYtNKJPx&Ll(IvYbxVQ5@UU&M76c0eMG`G>p4FKonk zopGv~9rZBX#+V!)ynI(FB~A)(5J3E5;2{pn7hk8d{E3Q|u@yAGA%Rm*y86c?(C4-1 z5wfzlDf`~gswD*zS?f3Rty*WySLJpZ3J^UM^@Ovd?Z7?sWNa>AEFNGR6?|{wEo;6r zgH+*6Nm8)We0I?vyh7d?-faU=NDsEz)}6ar_|Gmlc<%bnpKaks;0?c31vnqz8~4wL zXkx~6&Wa9|Q}`%C#=IgTZYQ~7i_mZgOkNP-IauDM6hQ7;x2Ji|-0-%u!o&yWo-zFP zE$~nlY|jVP2RBY0(OP?O*d{5?#wTt0WT@CKck_W&>Wfi=dw-&gB~y#5<>Gb^RmfyP zsP9tH#dHdl##l&o77XC*5PCeCeu~?J0F@$0B4nKgfG3?_gx#0+b+pq&3l1E(Fkiqo zo^tj$T^%A%FqFlKQDkmscZc1Zhc^Vwva!$o3gP zwih(Fucq-rG>ocE84!eDh6UhMadX)fQ$Rad<6znV^VbD2#0vsMD~oML9cY$yfTv;1 zM3+toyuk<&Yg3-j)#>9g7;QHmS?MZQJ~etC)}9~HnJCxMHTXou5}d|;(6x822X2bn zaz31r$#`I@_UP@O7Feg>BFU1Bv4yijLG84+jl`Pib4k7SPV$KW?EbL%)x5AE$pUvm zHb9IWiHuS4z>{PH4ISHEOOCE*cz>EkaqAMT>oIx4G>LqQ4id_gFxE*Q3kxOFT9 zxWH;?h`|$h281xa;N-BZIbU*x4(1-kR!{pAxcP<)l@>qnME9x- zLci^FY0_spo^#qeF^`%oRIV5pxJ3>2@l7YuM3pUc2pjhxB8C9__n^8Z#X%Xo8VMf$ zXh*s6b~-OK&K{`qB%r)Y&m$;s`wKwI-CfI~Gxnzq*9AJyhc2FK_w|8~*~DY#3frJV z0rkKCy*d-Kk;yU~IDs$!<43OqcOi zsn@^op%-o${I~!Bfg6Wx#dDQulkt>$O!%)7&1;g{rqia|_OTZ7gNMv0A)mi8LYDT1 z>>0hO{|U5jOKrI6AH1^k3I2`@F&VnI8nJk+ln-dCEX3s^8GuRLR(juRmd3zm7Q@zZ z=mBw|9;}?P*;))!n&ktR0S+Q@VD_yv$P#&ndJj0jhWbkLq6+}$M}S-+E&vUf5E`Hw zgBK1&_8%Nbd-O4f=vq8uW|C&B67U*oM(Nkd{S^GXW6zED#P6EWDnQEIfQK32g{g5? zLy5j-mdB8%RKKRVo=-#&U>|A{IDt196@@bo3(`2<=IIHRoeDYs0n-xZ`yDFM0QE|Q zFC;SlVYEIY((aZhRjtHu^u$82?DfF2z%76m5_KdLK$zhtDxH=wPEO{wW_Dxi+eb06 z?FGj|r`z`ZEh7=>Yy2B@>QN4Uaaf_A~I!&C);^t6M=uD#22fm)F9_)NjsTHBy~!Vq%~gsH9bwiyea6jv`r|7{xfl+bxyy zkEfJKCY_uVb68_GYWQ_WwXT+%$9$dbhdv&oZ09MA$^tBsff*Kt)=`72-wS$Q(Ne4G z5^EZqLd_e-k4GWiIEjDenLhf+1)@+jvCU!x7{Lh#U!_=tE_z{s>$=|ii_&0>s!Bwso) zs&Q_wn(h@IQGa{JCygEp6jO=M+}84adu`>Qxq=lpMzLiIKR94 zKBJGHzx~Cch~2GcW!!vUil1qDysacic__Y)fXI5dk$Y0r4mx6OCy8y|+&g!B)&6H^ z$kBjFS(i3;fEf*VDZeCoaxRi!$UhBu=}xxWlxc}&l9@#HmHzf*o!{FH7gBNH4RMU2 zpvCCp+v8DB3tkoywfL(ofjxV8A}vxPCdEC9ZLH{yJO+$UM{Uhl@8{YJt|b9+(*=eT zqZTDSDYzc$sNznvvK*Eb&#s{2(iVfYd0dy5qSA(gCwN>}my*&Bfr_I~M$~=6Q%#Xzrd%n>v~D%CvbmpzXu-EF6BwG|N^ln!FZO{GY#%9hG8TNuin`5TljG-~P2E)w!-=9I7b~iKae*fR^@B8iX5TC@S_viI~ z9naVE^?c8?$%6xNSK@*KRpjaKdTzy~1s2QG`+GF@-`9=_^$eGCJ`5KheL*kBJD%bV z-stR9)qHV*`h(qJw;L99>E4lRw(+cYL%7{T3w7SjTRO0IbM%%n{i|*_ztvmQDRxll z@QuW8KJ(4K;2Zdu0;r(Lz;{E43q3ze+lxHdVBH;7Z1-ilhctqWLG?o zzNoxI)DNXm85hG_lpj?2$MYlln%%F$-kM*5-LzLou#^pt{x`JaN-0b$3}>(;!?^Rx6PX|`RT7ED>f%Swy!*1wpn8hbH_8G!((yZ zAlG&TZJ9iNRrTikzxt-rkx4#XY}Um*#`r1=Sx0llup^#&cb;gS`yy}p&fJ$bE^E*} zx8^s#=i5+q*5;;ofewGkD6!p~+3t5MYhN!zG4H2bPq7X$3@^-;#%@czktf!EP(MVU z)?uHJxq^!wVc!+E*#V&`xccoK!`qYy%9DaKeXP<4v3K{FQv*q-8B5%$&m|MP&Na6_+rLBEsZpR zBA4NcdP5DWK#}Y4(|Qe!7y)mW;qrO|jdlTV*Ws^@H>lpi{6C8M4Vr*A5~7SllIfwZMoYv#%TgQ+_l#< z?Xpxv=^+jh<*aooY95OM|&TqSZ8KeY*zAoaQNX%jn(pJy>^pts*b$9?{Vq) zlA{*_c^|Bey|d-ciK{1W9y_|`sMtZV!#f^)^O9u5Sh*L@dFSC^fp;Xq0votr;M%)qd>E$Bla;BPaCl|)EF*P?Us*gCqMmnd zCjBDg7LuB?%(MA)OvS^r7skHC6b_3dbN8}mv1+=5mRVOa0AF%yUmLIa(LpIQ=FSz* zEt`kj``oRsNi{G3d};iB$8noMSS||`(@*z1XU-da$YAt`yOb2`!d=+cTK3`fg&-c~ z;!?OM5(#RZH6d#S924SsOP?nwFL~_wW6NgGN58<;>mx>-AM%0?di_NkqzP@1!jrcS znZ9+gDnSl;51F|uRVp zO{3T|g~O*4zv)|h4!tE=|LR|TGga+;YlwkBMylC1Q>R`2=Xbf@)m=^Ti@Je?goRlr z;m>17-fdXAQzzikFDJOcA~%mEsNJs#krmKSFcXNAx^~!nxnba44fEmtA~o;93qK?b z`#-nr<>hqOW-<>sct=LpD$E@*K1}YWox6AHpFY;D-SP^p?+jGga+=Ylx?S;tzL|&HZh! zjX2X*Q}}AUowOR89$5I>(w6UtBkOaA{veAVN4+2GTWb7UloE@6?98!*^wV80Y&Y8) zUx6{d(=#maX+Ie`;%BKQQAp&ZemNkjWLFC!nnRx!oOinZoW49Xzz??Ww~P25ZB1Wa zZ6}-cQT5WjL$v$eqRk4O{w|z(IXhnLK)jgkBt#rJp^CpwD|20E+B$e>7aA~FeE0XA zE~&8P@l}nEdb=Z@ufZa4?@>dCwI{9~zq$A58g;Q}I}UGn@J-y>b9c7*|LHe-gEwTE zZN>QSbgy~*8s*$WpYOjA$5i{!qMQl~mmN09apV3>E)_9BfC35Kfvl(wUM;gPb58~_ZpLqLy z=lLT;4?bUE{#c8CxPIuNNRwQ`51RTFFHW9rar%Cp{>^*WqK_v1>R+_rwidYKOfYfS zTtIMD1P{u1)d_X;<+q-%%`RvbtGy4SeJ2+;e&UPFxdTd<8;BPZALr^xSU1sHU2pgP z5OLU|SL3?yL;Ay`w2RzD{|&n z5DuyyR#6-9}X_x?9^be>gWZZwGY-h zZ1|(s{1vQ$5X`pk0D=*#d`ym5u_7|{xeJY)b@GP_lbmw2b`O^MB z_)^}nzv)Yl^Bc-sgwcyQ70w;zY z3o0J(BQz!EJf(Ykm^(a)%RBbx3Fvp{`7~8MQak@DL_+}f$V}L@OR6F|>2Yi2$%yi} z;8hx3FO7D5Nf%VL73{uLu;eAaQq(h-QSyT`P6?~mZwc!@_+?Ra42=?E`5hbm1Igy6 z(wBinj=LA($0V-jb!{;0O22q-gq5xrc1Zf@-E(F!sXXDio>|}KAH{FTm*%_4DM+4i zM&}(noj2%8rYVb*8=ZOWbTT_bFD>QS@k)3HIW}D-%d{si$D^a?L7YLLiJ}LwCne4` zuuYNvrY9~=FHl91-r18BXBSwkNM8d%gf-W<;A72%OD`s-|EhfJ4V#Z&)Z7**cJf59q!S-;?+>p*-p{~pB9ro&uv0sERr+lcQArLSq)~+!oP`$JN z!ZcM6q%CU)n}<^6hVGu+Yt15ki>Khsk2^X3S_|^C&10V@`e#nR`=ODFTcvE5)&vi_ zm}26QG6q!tpZw1S zORkmjRjUYw#N=x1Lu@qrnz#_xDp@YDT$hDROR^vm+HZ{oL` zRNAZyca?oe{P9#--oE9V^@bkZ`1Ko}?_*=P?Ec~E)tmOm)-2!oZ2#eJe*K2EHa2F< zJN>I(H|_P-^ol)WbD~s*ZOwa@RZ3Eh_DYF|`mY&Wek*84?&Iw`jfhtJBW9%zV=uSu z)R5qiq@2kxP+QMe0lG$8DFxG&7Rz}plIIzNXoZ|MBc8J@o4ME84tC-zhZ3Kzx&<>P z!;^fMaFlm9J!tv82fM2GZ(i!se6L-vikADLr~g3gl94e+QBUcvfp>c7oSSirT%t?A z4c?_$vA%FkoMgt?8h_IAI`aaQgB(IZ)I7ltC5ng$zi@u83vn?-;2NSb%t|gVk}m+| zc*Bn}Vfa4G{YGiZ$m`x_X?~bss1&YDn-`{2BP}`CMc7&x=EguYN+!yw2Qzv&rszFl zV$3v3%d}hId_Q7vKn!NO3l=AdlN96VcF=$6s9As_ZhTEejaykn!=ouf>n#+Sbke10 zzL*DfDR3p*qHiY$TRX(5Z-n3-#vaNB-pV*xn71O%73Qsq5ifP{7&2 zicn;Vc1hhZMjL4h9({9X%8>s7d#qSYQFs61TP$4EMAucV^RWK^`)Sk^?rG+9@xi|WG%qN-hBMEe@2-YO2= zd1_yIOToS-JIKQLVM%YBrQ5v%Qc`t*6My-Vl4)K37S`qnX@tUv*<2C&A&SK>$PQIe z&J4m8i-bzBZitD=@}_JpT+~1f8m`n|Soka~h(bR#(c;0#etWw(dSeNSOh6S!k|$6; z;baWTCxT2u`Jl*nlusnNR@=^k?wz2DpgU@9c3ipAGeUmTB4p=;o64Ch>Z6*-2@)9l zW&~C6v_!24WDT^nmwSaA`1V+z+=OON=)h%c-a8z_64kn&)(;=y*)*xJ-lkVU)0^S; zYv0g-=~m~~BgVYWI)Es4>AB5SK+e zHqlb8_MKOtZcFeB7d;SefSw0*`b|0 zt&C+APOswn!A2YM~7B(ZDGE$G85E@L+lzsNYhTMNHeQtR|q-!;1lDe?xe=P zF}L_MQiUCY?vg-7(0vkw5Ojxx7zEut0gj+MC$u9xU^oKGCx#q^Vzz*szO~qpgfg&_ z%SBrtOc5!!P?EyYhA2LXr`ni1@Y-PyQAGajxhrjV$ocN@fmT>X!WH&|?m<+*?W3!+ zt#H;gPP*KAf`0Kv*Wc0_o$S}c_$8Cx+9I@(q>dZA1AooFi<|GZ$m+-2o3@Ju>D(iCs+P0z+=z`8^U92kQPwpKaZ$E zk{Ts8<(LR~kH1a@ckOd#D!#-!5;;ddV(lqIH3PMA6Y#e_wDbEAjrrkxL+yEYQ3K!A zIGq@8&`z^BpRkdGRYE9ItR0|8m0aUU6~O>h1ABP@M|Fgg<3r|-km(`_L5XfJ040`n z04RYt1>$YKN|? z8|qgqvxND#cDTzWq8;RJC=_1(b=iH<8xg`6f1c|?TMBhKV6iB`91@S zErWsx6UJQ-(F+_Op50nH6GYp*rh}-1yC7Q0?7wkl;nZ!i{oL!@7miO5r%IQgF&EpA z>E}MyqqeXkk=5lwAz+>gS;nYl-yqA4Ei^0{+dl!)d&N^&Q8c*^Rm>skS>w2p(ce;~ zebJi{J1*Y;)o-qg{P-OT6_-b`N>-P1p}wr) ze8R#`j5&THk_Ujs=UjkB5Sa(wuqFe?I^tyZPdhPg{=m}Jq}`AcYoNGu;%^FF@15CN z1_A42S`8uB6|Oea85ej%D2!sk?mcU`TU#EKHO@~xQnJNA^QKtQ_ zbu|$iOiC&TI^qD7*n?15!~E?OJ^^Zn3%FZSRlA$eNY%jcSE|e|GO!wKa%`YLU`VAW z1G6~SBvq5~BoK45ZgNHY9?x)t)RFUq`%#a+Rb(BuZEY**%uq5qYD|jx9Q2)qid#hv zw@NA(x+a`;)F|nBTzo*98vm=|iolZg65$@%8!FnfgoJdUH){p`WrOs z*IgqPMA`G3!ffIybWc5F+*ubbYN>u0kf4%|>Tl8!5v zgGPKSXv8lTK%hWL+Rf{-0z1Q&>T*O-K`}m!pYxh~)fP${f8!D@Pq1b82`uHD zDT8UgH2{^#4`s_i7Mg{BfayUA7yV5r4bXZJB0I$$@C+>mz|-G;Y8%7(U~hu(=~F(M z!ogCeTQ3ONX+k+#J(un8z(@JsW2^vzEnEacpW=?(iKhZ`XKPDsa&{!h&=o7k#uU-T zI28hIQCU;A=bP1gIdplpKa4>A)K%bBF0dp3&lh;UvX9`C=upDBKN#YQ-^qaNbZ6R5 ztu;fEiiz^+q!m+<@EnQ*svxZ;iaV88Czug_=(9)E*R z|ILtnK{({>CfqsuI7RF|ToJZdg@EX`mV_k$_*z@zC}ha#i1X7u0adb z{zj9q%th5*D39pz{-A5zSxE~N^GTD~uK1KRb@I)jO>^0(AC zSQjP#NhW!KWV+l-+;e;Y`c}5iPj%U?3tg{r>KYKco(zSMh}Y=$f;_eHcOBz-zZFcb zxHk~iNlK?E4O_4Dt2@b4p-ttXZE<`m(N@&`y=CCr9~y2a>YwCw(RnR%4u92njtk=x zuLX(EHZF`NS=HpiThu2eJB)JREhhfA-zW(jB-)obz2U+GPm~FiKJ(oENCwd&VGA1j zW*-MnN#CDI>D3+Ke1K?PsK?b7ZCKw1%UBX1Ayl$h#O{GnOXJUa+0;0<+ZTlOt(s`H z3PQQL=(HuQ3A>a^R1TOFxrPrio(_vN?EUu?X1t~{hdcPxzd-YFt zI*?q}`=l1MT?-nfJCG($!s~`>wcD}7t=jE%!=>7)*kPQuYTacqD)cCNXb|PN`(=zqm)yCuuC*dgY@!b9d6c6+026lIMrsUCNv!RQA0YNkUcj z?Hr7#wAzy9S19_q3vsc*z}UCS?p7^%MV_8dn)gLSQK&o?1@Fuel%g8Z`Q$s_2aE2H zn0H}8{Ia<&^5W;oi{4p0I9W3E_KHNKwPQ&{O7_AtlyaY5lzH^r=jzIK| z?2>~Ljb=lw<-3;{)inN$uDggqI_EXk6vPg_j!eHU>F71Ny^z%?YY~h6(eL7xM}EJG z-jBF3*M-*2Uroo{sJk;O?oFJr%%b3e*Cz=grD)Ohr5mIGVfRyglXy((})wZ%7AA4d`qCxPxxaW0yqiT&S%c^OBay{%;yVq#RJsWt|&rk>61${ zD30~}oO^$~moM5I@vGJSRKL$(h+i-mwfD?s046INkXM`;#xL;{#m*d|ad=;soIEa(>!Vl3$932+O#O@b_}2u&VEF~iAqd#=?;J}Y$A z8+q&-L&)v1RzzjlZiNXQRdDS$tJo!s6MJU>+l)K;xdFl~17u)4%^F`_+Mdy@ivS1g zH_TH?KB zCBJZWko>yCgQ&C^^X{Rh($cfRt`p-g`i3y(dPvV0E6G)Ws6h`;>=owOzb| zf3n+6=Z(xy_(dkXb6vP<{^YuH5A~@b5zCAJ%vZT;1pN!WWDXS^mRG#(F#IVuH?e5$jEiqiHd#?(3f4JU6d3 z&3$Ptzi+z0om!TG2&1OD$=}WGOj(@Q8IZ`RGuJa7XnaZ=dTDvYx$@=@yeD*y$ZT%7 zI@g8qi6er%&pqRzlyonkdv|7YC_eqk$Sq6?ffz{Y$i97SX&Q&5nWLtpW6gR@*1NYw zR!tEn`|;`ZJI>ZV9B9p@tKrifNiKUf*7_x?>2HtbjLM4;&W{(YuO`Ixl(^6j#1C~a znfHknJfxo)XK7MAK3>e+cYan)?t58wZmhV=8Q$Y=nSJhLBNxWm9@e&i#A>jQvJeU5F1BnA))+a{lCo)!o{%lwq!OqCCO zU#2G!$;Z6bgLAc5o_N1r_$NeB9I@HVt^mK9voCn&v;>p zJ(#5IF1FFo__;a&C_ixU{8OWHs4dx`5~$U*oi$vAwrb)x%lAeW_C0`jK+oQ@F8wX3 z=5YsJ`RzQU^R3K*SBsAG&UN9WdBAC<5EbnP*4CP3?G;-&;PiSRsfy5UR3Z@cBDy*{ z|6a-!3UIgJUN7*jOz{!H7Y{yKHrGXde6WIV(CCqrCvSa#XM#$%J1SPq5w)4sJ3q=Gj-gr^_g_RzUH}wbW(#qCFA6 zSpEF@3$5mQ!5#hRUzyFQ?T^4XrNdgUg{Kx8qqnFBlJa+l%m|NMh#u;mHWU>L^&`xr|q3M(v0sI|TzEM_fQwFOK zA7v6Ht41W4V;8Sq_&!;OFy38WJ%BNDOyb2h=fmR^#L5$w#fW-Eyua{lt_yK7uRt+k z5id4EuYY?KU|cB=2@y|tQT0&{3Ol${x}Z7%p5@OA6BvP8ai*l^X^ z$L)>D_XrUK83K;GREYLtPV;W+@v7*INq69`&UImQVoad4)N^~3j7v+}@i_U8WZEm6 zS|A7lz>Mj~6`Y7G0dV4l{dO3?RFbl@AVayi6dp#Be(plOx9Z zD-d1|O?kpXCg#a%uN1Jn_!NwR<4;9iWirL9dmK=sH>s+fy^eIaN^$p+H2vf6BZ{M! z6{d2eR+`@l)Jns-#;qm+OByfc`9*I}deTsJ5zIptF)o5Z{7sHp2&hzDbR#OiPLi>i z8iy2w>s8oQ)|IYd>ldOqiYrI~!qzWHCx?SB<7mlQB3o<(_y=Nv5oxNoy~15@8_o~G zyMP&mK$vwDKwiogrU{{3-e+SQU`pMI?7{x6@PV2))7p&fG2A`d&O%pKfv^9}g7kkP z0satZx&&Rh%Mqv+z3qv{DF{rpg#HjBzK(0wb8Z&4xJaDdIS|6}9 znnRQZ=>xz7zDQXe(uwe*DMQyY%4^0}jpwmJpYXVmE1DDlHTTZJN~gSG2Arx0HK93r zBA`fTR3ZZe9midOIV$$DjzmGUCLL0W%;}(PB^^W|@_iV8F9hRnd_q$=Ir9tIHE4L~ z0!yn{J7$y}2{A5TN{T@Oor$w!>;Lwx2yts;0s&f(uk#ms-_q;D*7|Ts`87k7AMYl+ zsy5ZO_dADL>o%z&HAW4zGL9h)$*l|4msjh!sI(lqC`b}&=kb33H6NC&T;fuJm{Tm zhJhMDFp|3@S2+NZTyo*+b#NabnocU$rpBp0ZgB5rIk?Db-TUE!hdTA}`WH*KZL9rd zyYUaq`OCT_%A z5l;Crh*+Q26}Ly6l$zb&-JrF%|I={IM|*PJlpzcT4gY&92#o>PK!}d@}sqo zJR)ijqI-0d_`p^PXoVkex_?lqYpoeTzEy@Hi!ZT+hjC3znx&r7ISIRP%;@OQ10-uH zMtQ=kh2*MRXW=1QNlIGClW5JJck8m~^k+z!i+{8!HlOGE$x}!uP*`i~1IG*le&TZzhFMbxYRDGq20m(QGS>YP@;5Yvj1P-R_3_Ro z7EP8voAj|RTnjWkdFz;|OQ5#t^d_han(ceF(AJ!f<)J03M%&OLq zWYV0nh!Z6xK4t@yF<;e9*x(q8L{(Mg8$dsP*2LNO@@lXuct-Z|+aH$LwSe7ZZ_$+xHh|NMMW64&x3AgbRY)y|j8dcUNp* ziHD9;fg>!s+>N96LivDy#x^l~ji7eNp~h*LJJrQg&^0+;WOq$K?5kbX2Q^=Ts6g(z zo#>Y65SEvDLKi3_PFbzmNU?^Xpz3|FpLBp4d-#2{Fw|Gp=SlTVv zTKKlwVV?vZn0FMA#H-iNrW^S!I5bs1G_EZH zl#>!1JS^1iGy?Gj7HvNUR zLTE7^;blRSt5qJ2$p?9nNiq@Ns5*K!(WYM^;S#>gnAcUOMaJQ?7p)@YAaomBB@g>l zwdS4br#`~c7;qLcKL%~XI)(`yhz)dZdOIY%={8AAqIPR~!9xwRInSlcD4_r~7)dO0 zJxMy7SCXVa7!7OR!WbS~`YW?aucpSelLWlKfk}53tZ|a%PSaKk@aJS-iGXYbYZA%C zvzRd~VmWf0${HzgKjrq=i;Q*b4~tRlt}hv34p+H9r5Ro=_6%`-+pkSBpWvldjqM-F zfA>&hK-Ig`o0*pHrKCv39D65l>pbsGogMpPUtgW;!sNt`P5RyFrET&*_45>Fc(aBF ztMJ<`COQ{V3$07s10)V;V@`8)6bMrOb%$)}-XKL)eve(|gnWaxnK1qVkc{O^+uWOI z1-~|GjglXl?&e}1T!6A;)t51Z=sAMO;+G|^CW;5!cd{mM&IdNx5nYd`R1dms6k6yW zMZ0F#(`ddiqan4uC}6mAAZ7x8Qo_PRX68I2kUO)_a*d+eYKC1BTwz5qVcY@ZUopZhEBB9heOG3G((Hva(_*v)~5XzihaH@NR&UnxZN5IVlbY^Zw zY(G0W;yYe7)^B4B)LigRy65^v=SY-zK8H9G8kr^EbM2QRHII)U-{-T8nL}Fae#bnT zNx(Uu* zW_4=hz`{1?CjFd-lB+a>hqv)h?tNaf@e!gbh_6&!SEX2&<5<-aV`o7Cf2s-n16Q)` z>Z)lZf@PVLKBs#xdLGie9=@n{EXI*HHTfV8ykJqmriuu z&d6wAoGwoAktM2*ZAAo0^xAa1z10ogoTwqIk&!fqgyn-d#4m)odU=qe3svE$Aon_2 zPGXXc&^=Enl?-Y4_$X#q&YB;MU5m~@5%#?Ao4u(XGHDzk!p)BF?&a8?YDeE9(e_=~ zXNK)_ks`K^dWlF8cPV*h2593?n?;yluWF}pbl$gVa1+Y$eM=j!w=BPu1pz5kIazdQ z=s}G?F`PV1_Yy^Te9uvifx4;X?f?(LeSGw!eT+w3NsHU5RKE&LA>Mpq`FqM(_-Ot+ ztxy_Ks(ph|8*hM~P)c=n!O87sIfUzwb2Zj%-1VC)X?ebC8#X&-USGaMN(-o=6FE&S zN%@$318&;;C+2Mh2IyTqOfN+OO_}9tG4XPAvM=4{ZFB&t{|SfLWa{YGlY^iu?GNj| ziiuI298GLbabescTC4gL_g}A$IqGHP%J5@eB$)oHwNqH;Rn|&U^r*T}6hj-?nFOVyW0KO>bUeCcXa@;j;hGJo1upuY~om z`7hTm;LOewt-#KMIUn2kvXlLyxdmp^4=66SKM+OP6zup5;U~yAtAZQ$2@{p}=da*k z0n?@qTPuut3k;Rpgv8@X)1==Y>PZ2jCvTW4SBeJSgum#YFOSKY9RZO-Ttt9kFp+w)b>Sds z7wnF5^Y@k3sw&=@yMo=@GBD0~4baKt#|LuJ$?OkYMrjo68VgM|J|SeYFg4TX| zNU);tWx>VY&K+D(bWcAUWsT$H&iaM59|b}8QVz|ma~aAtyv-m6#(+BV_gr(?X=ou= zF|Z7Z0k2PDV4Qs-vZ*<0sj5xGTrHC){-6{LD9GFhtU;Xyqk-PsB{gx*u>=i)HA|s!o1@VV~d=F9J z4lHCEx&{k@id1k#2~;#=SCD$~5TXKE&Qk?<3pJ0tf`dv6mHLm{$-x~X$w@(0v z{jt=~Bmb|4ar0#_Rzs`Eh}YZVcpuyK!mM8yV|m7xC$9jU+ib3hCYNh-&ZIza&T;8D zGs)4bpzVN4&Z^4%{`7dCVp}$dk8B?TUVD-wZ1-u2k5HV(m#vfkhij`Wa?8k&&{{e( zsiBzJ!ld!=3-{%hFz*kytLBt|His*a_fHht|Ds^XTqw`nKl*9QHUVJ>lCq}}$e(!g zu)26`k_mSB;>-)#cqrr2V2pj>^bz~j&Zr0vRor!y3KqQRSxh$QaIU)atsWftBcPA2 z8$K_(pMG%89%EVXSAaL`_|sqXTK~fd_$Mz%PffVg-VbgS~U@8V;AES z8XofSG45QpR=(KAHCTgiIk}H{afSe?r9uOz1@RIbFa=+?X*PNBHHtrpV!_H#f>tk3 z4TR7w4TLioV~h{v*cZdy?VzD=J+KL47z)H62K7ymQsc@o0EAo~zQzG?fLN)IDVXln zoYO&Hq3VnUW|JtNwh$lK!vBj*31xqAQBgc|{Q2&O5UoH6YF7pPm=d*#nBNzYFAm&p zYf+Sh7l)HW2=6*C9jAR|7e1N}d>Vr@%<%td8_i!idqnoIMflOS+0!Ssm&3A*pKv!)=q-0MB0NCXYsYzZQG zg;FJ47^)aMY?A<9Q{pvyRFEQ3DFm>EHyc}Ejl*7H@>W%{AFK}Hp#prJyXnOg1MJ0S zfG7Te&c*v5m|Xl1d&`HZ(nphv{hrtJ5~P zz5J_^Z1^j@rJdfy#rpY*@<&)&-v9iC7I?E+ch9YiakG6dH3}|~zBUr=QPt5ug$7a3hYg&|_*wIqt0&R(U+_@~B(%c|l ztPMx|DqU}{S#Pg>a#T8MD?SzaT}$cY>tEOeaI~+Y{NiH#fyTYjzK-?HGSKe^ z_%`fYMO5Keh@X2G+7b6-6D@P&E#+Judh%lrTj3vr{gmcEMUeKNh*rkhc&g>daNu2^ zTgCXk5BC1-g}r8h@AjOW${0PwEw9WZ-==8hxTV3Wp<;_5N4#CBf=lZbKr;vd;M@19 zMot<>LKW8xJ15w|ykp3id%!Oq*m`e_j=I%IvvJGRDOGT7-6BMqHVeC1lO8@W*K@J` z>jChu^(j;S<+YJ*7t5Yt^|=Ce`bopquEK~r>y_qNQrI?CpZ0OVm)!XH$7`7JaW#G} ze7xWl@bUXuvs1?rZhSlp__$H#Y#(2JfeRmhcLMnMt;X3tzWM)$kFyt9Dss5=iB>Dl zUi@qU6d!T*kfXO~s9l$y%MGUUYHqx7Dg3Y8bI&Eg0^8f5FXJhWAdgJFTvP$7t#0^S zLJ-V5f;^-RUXfe@mxC&<8#dLdw|{pcr+5_-{nb6Cp%nbpJ^u;!)F}-`wzO`k+djHy z(4fF_OvjU+WGp?|4f3Z;)0PjX%Qz_SE)NykeYdkf-s{WhFd#@LJBIBU#OJXK+v*E- z7EsNY3vc|fBGl$g*T(;~yz!^S^?$C20Q@;bTQ@#bWqlh0o&?7eUELLJN-MefrEhapvPL3`MloW5^z$S5=0t~AbuzcH_G-MCy18#ZmGKof-f zu{Q?R1abe5@_|e-?<1Ka)IC}i&rOj` zi`pPnYO(>)Mit;c(ngJPyatGUhh{QMQh-cR%=#mlB4|Jta3`JHhzHU+g^#6kpaH$Z zopi3L4@l?sek`2>4JeKa>0IW*aXe*Yh!lE8l|A-K)Y}B6Uv1zRaLY(exbr)O8-c^; zRmLtQ7(g#pKU+_$2lI|5S8IdUx7&vsMfq3*jf=y(#`RrrQu2o$e`)=6kDuz!U622| z8mKSBvOnqZf8)-?e^e)a?eS+Rbh%}O{nw19j`0Cm%_^K~kNVH+x$7nWH8U%`Vmf>ekiQA02xDb<2C++~+Pnl6>E> z2O9r_?>;*A0OD0;hRpxW0;c~7;0eO5mnF!I9m>s1x@2#?B(^Lu0|}A!J>T5H{t=!4 zK2$7BnwN=W6Vcr(piwutjq7#}R7q3Qd`R_8ix{Q0C%Xq_&mXUi7?sOmCl2J{C7f@~ z%hhE|-*m6<0=0Zf!tzlqch)q7-CUhoSg z{uGJ4W?D#`dsRbrSRs^?gmRDt6XRw+1)iCGT3Fg}Rh%*WQh|ho`=q6NANXey&jSLo zN`qi>30=VS9gxc@>Vneb0I{|xObNMnCQq`{C3|J6=cz?qr_s z;UOvHC67x&nbfi0JfbL)%+MA>(B*K6D3!Wl^Mo{*H+Zi`ZB#8-t-Q(@{`jyqKHhV#~TSfwA*>?wz@+68bXj zv+b!IEaLa{l7lQABg&SX1Aw3l`ho?bZ|}>)b_N`{{6`6aUi0ZI`9Xf3QBu2Ypm9;k)0gCmnm$*Ae`hP!+=>{n~98%3hE>g(#3nye@9Hn zT96z{y14=Rwh~8?OvG^y$i(X&OhbGor8ff=UAO3n5NFD^yrOQ#c%%#!B$tviLtkne zk&(J~pdx|tW(Xa44EU0dwLz8*OBivuRa1v(&3sVKt_P$QFKg@8 zbK`%rh5kGbp#zxzA#DegdQ20zDt^Z>c;y2Y zBeGirpNC|5(2y$4Z&hvQGt^Lm6BwKkDgcQQTj)P4$uIpyu#*4U%n?QI z3w5{yXiUG}TTqvxNn2|z$*DRzXkyuKK4!e;6eDu4;h6)Ie$Id+ZrJ^)Y)>*wSH z;K0Mw0cg(S4-~Y^M!FxJW|gV@Xfe={Sml^y!O;{ITfnpSOv^ zLardp2MO+%uOxH+c%P7K*sGx`Z%yyazGJjV+OR>vyzyFZBuim5M#LGk0Y%|t&Lu!- ziAp$24wKWjzN_9v*ebqY_rsDYXa&yG?c)_zUd&0uGmC1GsWfKZ0LzT~&=hk;C4I!V zECF()sn;p^8>G$Go3I&)Stl3%%{CFNRJD_M2pFA^{N{akYH7o1&~c^L z9)k>3(BsODfs#$N4&n=w0e`=>^&jYr5A@SDYE(6b7DFfL`@fu0U3F>Z^*X-ZWabe3 ze}hdFgJ&3T=Pa8YkrXl<63$a6Ch&RHA#}IlbnsFV+*00fwixpi7$4mRhx%21&%-$A zgy&|Nmxomb&ap9!^JKjqEt|h@2!K>8F zd+0fDpnK`>Kjg6B2Jil;d7U5q-t2FgX)Op@Mp;=YQ>-Iw6})l(qxoi8^W*#HmqiMF z_V?IJ_;9P>JMOt|-|q2gF0rM@(UvY*~Y6soh) z>ZLT;Xr>G&!@b(bhZDolCe9wMWSztubepqBJ6SC;2(98wZy{?XrlE@iAPWZ;3$qF< zat1)IT>!FoaeQ0!w3(I3!$g0kS zA1Ajm{4QAA(qez=0I>6wmU$;ueKpLK`3xiWGo1_LeUSQEy%#5w=Gf;fnXbNn68=pu7Yz~yLg);gJr9!tVv`AR*9{3j4HsclqY3w35t6v}W1oV5K1olW z3IO!Uzdx7B>b5hhDM*#c?5~CXBXIMdg@AY~sTi%^QQ55c)P26`wn3Y0ZI-?q-NbUU zH9TRLW~+7afd!*;NLNCk=-u!mT%WF;LJ?&+6*r+Pq~QH-_#uv@3s>-_4BKpjYVz>n zaRz^T1sH!WGYfE<2=VX)I1z%YqwzSL?!19p998GpC6&oLmLXfffcUm?Z}GMjCiudVIxJwJdLq<<1(F#iR8;N+SA42bbx*hdDa{xUYiQ#qN} zOeL^Z$8X%<=*XiQJwX+skp51i47i%V&mMuE|4W-~(ctSuk&%f=Btzz@3T+jX}KUo&D3*kCMi;?(XBCJZdzJ(og6uNJF?=%8Hbk-BV&oj z-&dj6DfoyxwH(Ck;p9^`LZPX3HQ6W>-IFXw{$VBh`|ap_K85HNYMlN4^#5aFl@NNk zKNu_1?T5V?s#`v@p3Rb+EaLaYLd)p|%YntrUd{&Ym-9UpEN9-$S<4ytg5`{Y<=}pq zy&Mtlm-7}{4*%@sJeA_!I*WM7MvnJqFGq^|<;))l#%3wcUe0Y8m&*}VD2Yz1YKME#%BM$9sWezp8yP@SIP<9PN}iSolZqL?ev8_sdc4bS`;@ov5n1;!Bw4gJ3`{;KWtI1nRp)By06Qb*@gc& z>(q~9#v>*fC)28Ox6hy{sAEpApK;(j^p`zgI>ec4>lfLx^ev|XcTorftExM|> zX!&>II%|V1=N}EeoMREt+;?Y`-hF`*&A5OjV_%#iON=L$FzQ(2^>#>F)A|_Xc&&vh zy%ou*Mo!u?s;LuUNEUTO56*0(C$bowec<1ztUhqn?lT&RoCvzB$|@RpLsDe~z?n~( ziAyJ6=Z3$y7tH*eh$+5+q$L1pE^WPCGaUS7 zB!Mv!NvoEn*tKPrc;i$GFCa$~7>r0-k}L&p*Q{E2fi;%Ez(vyPEG7m{fHyH@?k5pQ zPLobAng-%wTND(doho#kQr%u&P)l5e-sjZ(Vy+9rU1(}FZUA?{0uze8(euvjC7*14 zUZ*C9zrN4OHpQtJsf*EDiWbyU*m^&MsA!KP=93v9|YtU-)w!q7nCgQ1&C(R}OC21-3Ok+-mcOVRb~zU0Gm z7h2+PTgB_|TBTQBP*u>$MTzWx0~@#@hGY9@45!bYS7^CY|P!j ztoKduLtf6S0!Z*fg`JufC6k+{eI#)giGJ%w{R^@pN6!TOEcqIgDNJYiiLreBTrU10 z3=DS(T6L%?;9qQj0!950Z#|$jx_MCLKkzC5-#8EC+^xlcZQwL!j4w4L$yOP<3zmz(UQ&s78Qp{-}5L8b%TI@A{vz4>0Yb7G#KgGh_>^D4`rpEWq}yG4*aBm!^Eb1t=kM9}iD-!l8++wnN=?IB_6!Sh z6jeE=6dIpFouMQG{rTnYaPBTNR<*XIUCSoB9xl% z!?^!&w1d2a)-c}B&tI2@1vrvcZK~r_G+o<`;OH*}V)X|9CK&bKlArzoMEM_KiWO*T zOj?x?vRP&vpaPhERBw zsO0B)#R_q;I9HAm%qJP{e%f?D^))|zXf6LIO|ecv)xB60Ie7u!1yKgMJ%s?)wi$t9 z+}QP{%mL^zGt#hnsj&l-z3h$`-0N#6_II1+|A-X#pTQr5V%Nv0nuMmsAas~(sZMQW zaIXQeHgaL!IA9ms@Ll*)q2`z(_fZny6aj%ap1^2`qyhF&qCK<39mk~UOuSEEv_{fK z?V8itGT|i`Sm5u(NSYoX7-JxoC8$^d?&Y&80AoPXhm!87%s6g_N>KI2eIaA>6)61s zsi*&lC|Uuy)qf38DCZ6+2(|r@TmWqJEY1f$%}4(g&qyha^wn+ugsJAT8=`gSs3lTA zq3S=OGv*>IK}`Pv3~}31dAt2Fwm;IwgBxWc9H{>g-fTetfpc%Vo7^g*WQQeR1p4t;-$kJ z!=+Y1O_@WzJ7B^J^MF;8tK#-3e8I;kL|j?G(P>{{?#!H(+f4aMzMme2&MH20B)JcR zt&cAL`^IF(p>QxCBi@HbyY7yl{+tfgFmzJq{-Ynlwm=;OhpQ3C8{Er7u|Dp}RcT@D z$!cm;UlQz(CF9RW&!1*EdhgWSoV%d>O1e(d%Usswe|6O|!XPJsvZ7m~gwbSy%w_6- z@v!(HDe_-5dH^%YnL+Q@(Zj46%Gc4uhjG#unc^BY=U+5>pnV-Z%+&n@NTmClz z7BG7F7cmO0+%XD&GK~17xP2Wx{66mfqWtvVG9_N8(5?y(Rb^&ceX0Vp8nnEH{i_d_ z<9U+Y<86j6hZ7IlFPKD~X=bCW^!?}hwZ>~>-J!y*7v!wyTk221Cy~( z3+I}KjZsn~GJ3r_bu5tXDOE8Nc98rMNN*rG%-~FV69;XI2-*S~-PB768jfL{i#Aqxo}xtU7UL*v2_EDX}-$+ES130!LPONUKIaiJE=d@;_LkQv7SwHUJVFr*gam6%eCWqqMqEDCxqstLMX z^{dNHt1-X2><9AWpK#eoY+8wDk*KO_ZNwxj+NroqmGRa>iR_g(ZlPMDgzu`m&T3$G zR=Xm{A21riXn1&YyVnKe!~;fa7;O~Ztm*{>`VScYkG;2yjw8#mM#apM#b_}zqa}-( zWyxa6VrG^lSHP#G3~`Rz|P~3m!*W;Gwnq$z>dpLnr^GBgXhZ%GmBQ)=$P}=f_A#u<=EfH+_z^* zp}ap96aI@-Z}rb}u=n0t^Xsc_^;3g;QfW4v+C*0!wweqnd%;@71z^{ne?l>%Wrd1gVs;t z*nf|N^M_e!0zh{BpU)}(_$~ScG=8U3@BM24jc=o6XLH*GKe>)U7(c~3vdzDVcjo>q z*Rl3zCvkJ|^ziR}ntA9>8GXG}kKxz;9m|#ejZ^;L!U+FOqo`@Yf)P*YjWC_IJI~=pW_}K)wA}77aj@`IA|+Z=(b)e@#4=ZDic64Zz9= z$Mj{a4_7 zBw5VpXHL9HbuS|07rOnO^74mV$p5Vj{XgDY{x$H*{`0_Jgl++~pkFzJzhQ%4==MJ{ z@&BA0!qc7EWduN${t6gh0kU*JzV>gjbhAGxOXvJ)rLfk*)#ml9%l-<;{+J#5XLMQi zG=SBWtF)(QGV8<7qF9jE{=)oZ7eQC-G&a=xT_WWwmUSeAWIoVJ`Xk;qteT*{@P7=f9cP{P!H${&17`0ftMzQbm70RrH@ZbpLyc6@q(p ze-W_d{l)tFU%RqG-sG(~Zq*#2njWF*&+#TNzZgAn*MyVc8I_Uozg83F6^KsZg zvWcr^tg(&(?Hl6%$?xr-!SedYaT$QU3&`uXz5MfeHmAQz5x+_ifAn4Zk96S{*Xxw_ z%YfC}`kmKf48Mk#>7S(t19a?OZDd|g|9mj~@(T?A-B9*lW3c+y$kG1eK_qM%!75;t zfWH6?pZ@~G|5~KLe;+U$0f^uJiY|NcYn1&p%Kp)k`wv;9KP6xSq#OVg^1lMw_WbIy zzq;&S)MZ=$nl8KZtIPiCvVTRFZ8~tjtC};ryqYQ=;O_-kI$q52zcB(7XY~(z{J$5| z+Fo`r)?Q{X0F^XjuPfoFCHloRkBQgUkXuCUYOm+4mnjTDDb4upQW&tB{bC!S=_TZr zK)d=4&@{L5Q@3*nFnl%|8+UHu;_v+_gZK=P2K`=~xT0?b*p&au^#1RZ*8bxetbamK zD7d!=;Nx2T1Xz7a{#V6 za~Bz}hq9hekZo^M8P5xkivNJ#?5BUt(m&t7=Ioac;_s%<|54fexvb-#6j}Yd6bt?d z{#E-9ykd#NjwGVp zbMAqB68%|R1Vu-+38Q6SC?{+a%w|)-aU5NEtz}PfF;@W5t%K`Ix1PD{VM~slKaKuw zZ|Y%V<6t+TuPh@&dnLYWwrDss!6qO$$5FL0@q6W8Bt@%(y31Ye95N*vo`$3 zx-Q&;rBx?IzZ~tJ>_w}*BtRP8ye;M|t@p*cPeBQt;T}#X)Ssr2d>i|C-EH>R1d~Se zKAeo4rZ3f3w;XOGMTvj(YP99moEtp95VftiW-nhxW1&d_{&ZmY<)UGX9$+efa`IGbs?|Zgz5y1 zaLsc-D6WVyAWWPnTHn*#wp|IHbbC)~$^H&kuG-*>>rEdJg|@eQntAKur{r>tJv zmzKBKU~F@ZT9xnW1K&H&IK)e3^u4b1swKOi5{$n2m@31HRNPN03E=3@!;ETy0hz|3 z;7k66F4h#=wtbOT-kyU2Nr?M-m}DmB1@yYn5ZaJk3GwOlUq^V4%OSawd5QMSBTkLB zgBGs9wt=OtzzlA$odev#jlIcG_uodLdsw~0lny@T<3@>k)|B! zEWE=f)v&t$8#t$%nyKj7GYlK`%pI5p;9m2|m-u%@pK;DoRZJEhu2ONa>=nVgshngI z#XuhAa7{yhDg<2c+KjshI5OyNx2EC;8`}vaQ9zkGZSUuMOB3}xU)t~vK?KT?7jQVf zo1@81`j`yl`N^)^iGB(5raxF{LIOUuYcTc$VK!SphG#!L z@<7OajI&}O%eHnJH$tO7HKUK#z`d0z(@07}b%dKS{j$ zWp5wDF|X%%LmMkyHFdd9V*x+6?92f?zQ3SmD|XrSav28JX;5pGH&=$>B$Uvu)*;WO z^)xWMaq6?2)5TcY(;m{>bfT6bsM_!za>i4Xet9=}HAFi~hFoYRa+4GvWHv;x7HI7> zBzj4Kq3r3!BM>LA?<{10fifSgM2lw2YUzM4jcXrl?aig-7c*tM+4$zBhXp}0eAm5z z)1ssBhD2a42uXLX6A-`)qnhn0p9ZY|doGO-&v~h{)&jhuJ=tlI04*;OnOwHQvAt&s zltt8;<)XuV2j;s%I+0~pZ6HpYA`js0~}UAkYDn>O)- zSq3*^0W1v{aR>d}2fI$iPP9{ zNr~6ka9GT4@cvTGuJHc2d^baik0j_}Q99eiX%7(kvS~uOZ9cLU`*n?;kuh)6Mnra} zEp9L+Rc;E&cxiL=4HA@0dkUW8SU~+*{qdkT?7pF|X?yJ-j_~m3#)e0qHa>4a;(4I5 zRatEI>YST2O4eT>WS&?vtP-)HF)z=O2+Bcuh;YTh4}`YrHiy$C znJ*+D$GbFz6_(YJIQS=XheY5phMe{i(lAp$$>d_=ZF5yIHpMP$%{&qg7b+20;v{#f zc1q&pY%9(A+qR#4B5k^j@z-G;jOT;UTmyR7(5hG1m&1QW-g;z~{SL`oh`tOeY1Ja8 zwb(S|D_@b@hc9D%uA_c3I2W{MHTcVs;u!et)N%GVRI%^3&*EH4r<<#z6J~uIJCUaj zay*0=l;bqzO_U8OH{JWEW;lsCJ%Eu>Sz=JJzO} zrG1f$V4h-6)*=(v$zp=l`{1M0V5{ z&mf#^Q_oD~uWHwV3HP8=Y6A;C4cdDx{bT61w@O|epRXNCLAO&+*zvU7--z~)63)Ed zY+HHU@1HLY_`STIh$wh_Peyi5yOvbz5(w51>e$;fPg{4jy^ddB&mdp5tBzag-*mik z;o9!cZnamJGrU~w8s5$y4t6)5!`CuS=ijI?DIo4ve)VjRfKVT*zDfV6#m*MJQn(q z7FrmZr0T^ZK!`SnlzjxEo807?!@cSp-ogD*j^QjECMm&v2NF_$Et`jGD>aY$?XGMj zq2Wwi*jY+#;9$@zXOf@y;rSquMp*>*u)~!u!C=QoLV0LHOhkw5@_R8wz+1Ee+Q*I} zG0_UbyY)Jq?5+!EHY%}EkBAtMWlLs>xNBMLx&%0PJJK2=J-wo|Nj|n#XcocXYts=w zC(-#qf~_%vG~9^(N(hFTK8thJEmHw^yZcyvFu?A~y%12)`@pQWyK8HF%iNn)^nRXO z5AAem@|f`sjaPEs(UhyJoB5jv!Y!}GF4Qi2P}3 z+Qmi)_#d!_9;6ZRz;x@i=JwH}V~>xf&Jn<8thhz3qGCUv9A*1_PS67df;afMv#c2L zPFf7C#f8kalLeuFp*m_8gx*a-9-<@!rWjBDsOd-cN{YK6M_UXVaBdZ??ZbVWkmQ>4i7h*O@7>w z#w_45_;boT38)@?+ihg$!Amo#dCRXB>NI6f@SE|+3Nl$qyN!KN?c%MQ4Jpk*;7tqO zWwB=o-#wEzqkYf4*j`_P7V36K?ZpPY(TEgfxge3fybRkT$|B^^gX|9b3p*3$-J)CyH^!ImI}1s9k~1bfS50L%Cn^QCnJv z($HypnEaWrT3nQC*1VqOIz<*Oo;&l0tyo_$E=udQqYut;hrmyV1y9%cvlD7r3nNmZ z%GcAl=u>w%m*_>7fn3F*_FG|+j_P&B)d<)Q))LL0*BaA}BeafV+Ld+dd$0N2ifXtxz;D_BtL|&$<}~o|Q+!yTG@{!m zF<+mIY5QCJ@yF*`L6^UE8UhF?Qw|6S{n)nmest?Y3%kjnAqW0&mxOVT_1+F`3PG~ed0*>bnsZk70!GM`;;kLY8NGVq=Z zt(Me4P_#JW?l1{@gHhDomRP$W-*ns}t8PH&y3etXW6zQ1cgaY;eHJ|^I+U}K-X385 zR$(?nw3*ydx0Px1aN5yr9ER&RhD`g(w&WrqZ4YvH5jdaRLPvd490$VV04*o(V*&rn z)_dx6A+Hbu@6t`Hy8cQpe{KblU=zbwZ(C-G!B)RsXS;iQvT zl63oL9qw~D=cwqtxhr6$0nj1zBkOBCO0S(GO`Y_bR;@OHeQskR*A>gCGyNgt2V#TS zYB*BJB>M`kbBY?QkhoU0`004V^5PM~w#r31EI2a_Uiuot9NaUGBtwQ`3*F+!UVZVU zO1Rq8{JnVvA1@Q;YF0?|wj%V9}TgfO0?V;UbAr3y;V_6d`N_3OvUV85G?H^MilZB z3xq()wNtLtCGHp4Yv2G7wtNu#7y>Ioj zUKY#=P^k%1DwpA<8=Leg1#rMnDClAYx{uL3y{od%g3VbxHHnVl$HwD<@c!(GSw&4d2ti}))T}tu17*Y}simLBGuR&p=2}8gi*uXLg zr~RYiWFPPo15}^TqR5*$EDk<{MN(?5TUazZeavSTafWsBk8OlRf|Rt+luEwpuXsap znMC4e5?q#9GTs;HmAa>7Yji&&RV=IZNa&RoJ4F3>+Ot=Y=6m! zbG(eY5i?$`h(2yHH>&RL(KFs7Hve*d+9Qh}pO#0ew?kgBOMlLIGu81h{Co}b8vUbS z7|~)op>mxK-s9T|3K;Lmn4Y1_*$l=fmxW`aOcsQ$VrquI0{lwAWDLUX87i!DnH#V;6J=-!IC}sHuIV=oz(`H#%liW)RoBSpw)I&iV_%!5N6NyM)W0?RDVh^CJaBdh}f7&OTziyX^<(ggEfqPuP%pg zw{c4JdUpDN?B<0*ee&#ehqW-SS(B*fw)BzPaZ+SUJs1cNJ9&!8db7eTB_jg59 z;E09vreFlJP%B9sISwombq9;bp?6OSF$hwGP2_l{)dHbu^qjXKlcyEz0U1&v+$98f z%NHs7{2!ONO8AgG4p=l=%DX{hI!cpCo=L`3Z>&cT(T zECJ2#&<{q1r^C&RWe;0g%b1YTHeV0QMIBr&>%GsBENsAU(LbbjmL=i%8+~AO_9`MC zg>F90O{ZVvo3?a}yC3qx6WpX{n!W5;GiV?9r+1aIH#^8Ev(UD-g?rESVK&tIHY=$V z_+1tdk~p_aLXpP#MX%6uJYoEQ!CB}X29x(>KtStZKtO1}Pk+X`wuT0Z_O>RLMt_?H zyET_=m&Bqyoc!K^Hv*#2GI1R0`Wyq)qnFa->8Y2dm@6s}38ABnzXIU^k=mv265JZz zxx5+h8@3vZ4HSa37lP1V8j_QJF#u8S9~>NX`@;KnFvJ0Un$;Xwbq!eI>-05-P{QpK zzf1sqy8G+3>E5xpT&(UQVhl}~7Eh9JPfUgupXYTm#UPOW)MihN{3n_8laqHX@+=4; zE9NLaoSFJBZPYe19<0j}x8>*QMdX#jV_JM)USe8oF!N-6wAiGFFl5uy)A*osO`iK$ z8s*w>3DS669-0HS`RKJYg9G~t|@)HeAkl)?< zUXcu(c3Gn6rWxWl(SPfs)XBsyrYKyrY;zdXc7$)j$cR(<1hEUUUt5OReRb54rdb*xJ1+yPa!nhbIK(-C z`4NJ{VhE4#fYmE-bktDbC2F3QF8xIU-Iqhn-CYsXi+$F;d7^2$weNv+R%^aCMMo5Z zqI64(1%<5iMU2J_P=IyVN!I!9OVTID0$n zWX|6wc16E*0&7{%?%;PnLSbTGSq4I`hJ!NbJ|^A-`s40H`P(&d3~V)(hn^c_f`%+p zFns6Mp+jWjUj=JxhUHs!pT8{4W-M48?$x4Ax!*E7>kfd;l&-{&N0#~U!R7NPoZs9Y zg16`_51n^w15m6{ss6A7UpvuJh`ky{$XK0;5Gd zn+=a33K79t__FR0gXBEgF$}X^R3@Nk+3{21e(*vr;|Jd@KGZ6XndgPNf_4zIPT+HC z%ulnj24v1m4yK4KcrXm*jxXftMh~|SLCkY*D3SUgRUKdULu zwBp9~dEb`OLchLzNzd!PQG5?vh{8VPY`#Y+KZT~o!dR44=T!TacoxAoC!H>n6zR2C zQrQeX&0ZF3t=+h{$8H79Q*)DEffM0W6qwjfHLw@|?+2;L#B`@fZ;TjivS>VDM6MJ> z-W>8|x%)&o1neODh&+Cp^E3tbLf)nIV6`v=mC1XrMe^Gi3GaGo4*G=_8u!qXG0y5~ zRa94oAROoxN49#JpqZ3E)5yeGb#AHp`fj5?er&YpH(X7-Df4=DLUw<(z8dW%ToHX< z;qc%KsiM#4a}n~V4^^a;v+jwtcDY$+&yhMD^+R9X^N{d?nq^%UlcVTheo)U(3s@A- z{|1@^orc=NlM3;F*Av6#E7w!U_L9Aj~BV+-m9|jy8KH6gLj2$`>Ko?7R zYUXS89BFoLrO%olK<=bm@K(?k)f2QA(D|urwJ%3AA`1%p0L4K zBZ<4a;}%sg(*y*wq@^52(Q?B<`AQ=jFd4&RcJ#q`wnDm-zj?da+=9R-8M`4ZcSA-Z z#q@1vgfWBXVa8gOS1>?js>h;1E!{Kv2Z%fySjX4aH}T8gWD+2GB0mLc%8&J=8gAj~ z&w0GgcxpT!m)Hef#kmIJaywl^V%y^Rf+3D@y)Va>ldmC43>GqtOt%}kZ%A*szh-K+f#?TwIJ zNXPVT0N>LUoGs6jV{GGa+sf@y>*3O*#2Dgi%_Ej@z){Er31+c=5sK}d_p{GyKibr= zSAGI1hrvVn)8;^tYTD?E z(`(1G1e4`FmZc_ywT^doz_elkMcC~np}_o0tCPgpy$!icTyKG4=9?ynr5Gp8w*L1rI>o%stNe|&$yUWGThig9piav|ulM*a-{Ccf?w6s|uP zvgxIY+l7>Tom(#hb#`6z6jbSqEbHyB+Fs5w`JIWa30afdiOBrgcA?e|N2dP7$bR?4 zYo>L{m;2)$^^XT{5W*b6LJh7jqfpZn$Gzgk@72NHAHOgP?@Q>>WXW+WqCCvTLXVdl zLj|>CgE*bZIAIfm%^z0mu=R(_gHs}(Q|+rReEf(!!LzB#9hO;Vt?7F&IlY$IG<^RV zcajX3z?L?y+GaH(jF@C3f0;pRuL93m&oT=yo!HeecI&}27W`8gdzv-Eg_tUufImdOkIla5Jx z^q3R7El-NlKG*u9_k|@5`;w@iV_!&VC)7!?sn-clav<8`2}FDzyl3I*F=(B!oB2C5 zp$R0BU!Dz@hzb9pq-|HKcMnjH0X#&%uL~DEy~-{Agg*&b1>G&4<|m%;Ud>RnbgGgr z+^rw)-MBgCRWd_SB@_ePu0o$fKl{yJB*ff$rRNH5lX1TH|KO(zEf>a0v;y)T0=wFm zgK2Yayeth8Mdvx+7Q2x)BXYmW)v)|pa+}?i&lN2d@sdG&yCW`cL@w;y4JGgXyQ$Mx zUqihU!S2}m>nn3O{Hz5>ViP_3k;$|#D8hywoT>hyUddesUu6*#`WC|2<6p_>gLn*D z1K!`e<#>}a{Md94z~bksp*d>`)^sp!lII_*w9&;4y-Dt|Ii$hGr%DT9>T`t$zXHow zVuA@ay_5h8%7gBYlg1`$`@+t#XGX|x!|OPVxkn;5im)f-l^24R(FBK|9Ir#c18gT6 zCuPPQByccb9x;mV&rG5O(l(8!kVs+#j0@i9l)}-6?0I`Xfw0ZJV{svsd*s_kjV>SM z6WzI4%RIH2f5%y^K#!gM&P@D?Az~d;{+t1~YsG@2%x47td>p!UxR|{ZS$lpmhOL@B zA5UEq#Py=^HJVigz5BrIeqfZg=ZJ5}3fk4c8`52_V9}ePGjmqJfY=WeQIwR|H?%>l z6zfygkUPyO+{9rBF{~R2h>sf-mJ}B#`(s)!X_kZ>Rnmko5AfGdhvSz^4XOu?n^Z2N z?el2XazjZ&xz)yU9ib+2{bt?nVr?iz7<5EG_DQHd7vdewh$CtNr|(OO39JWD*>#KL zNdZqW(2acOx}?+WX3KI6X&z9HeYu0vRVOZ2sk}VSCOr;dlKX)rhfr9a$-LwO(pF)M zJPDlu@%FgqwQ)p6k@{iIZxY|gBl0+F%gjJ)NmXm1k!3|;SdTXc5#~NxHY>U0t_etdSh)Iyi6FnyJyYK1Mg)1IWLId{1w|7F<;;{(Gy|V~vbFNHS zLX;F}53_;=r$pf73Ws#iO12)>P#==gs|>e#wPlaI~((OSKT%+cst|PzcL?o5Np`Cs;v{sf+UN>X1>7-Vi0b0$(@_ zl4wbtl2qAn=;KR<7zDzs6tlf2?pM98xH+&m)D&+Q{w%g^O3H(V5@d-bqCVF})ef&O zmlnm-_v(9(28aFVVlOhnH}`419!*3MyeP zLtC3d5!VM2&9Cbaxv(x!0eYBQr|NMP9_%!NRt3K-~oBckO#aHpadra2 zIOGcQA0x%VhpN_j5SvCPsrls?-YUIJQTniHGC$c&#&Q)CyGNQ`ych69v{=+8B6&*6Zqz5)L~)62?{{Pnu-BAM3IUsJ_6b9ll zT8Aj4jx{$;o+W3$9XcLWx~BhdVj#YcHQtWB1q)USdy+~Og97q9mr-Dho)7Hq3a)p8 zjisg-d^3(4J)31>4Bf_^ykki#^$D8=Kux?`q8RSg=mzC~~{ zwY)_IY{fiX+Lx?pv*QAm)Atop5NZE;bGaUxXOoms|~{+6=SE0M%{mcrOvIUTE=A z-DCm6BEwO!6dC)1WFpG9Wxmx3I}E!^h)0X;E|GH~Mtefn16%daSmTg`$$b%U5Ir4& zbm!zBcG$Hj>|QbOxh8xGT;&i5+DQm1?atZpG78hUHEIbJhcbhL2p>l;h1xl^U_*ud z4M6M9J{*8u8yLEmK<(Q~cu~l(=I5DNo=ik!w#ImH@NoN#pl+wq^U0v!Aa`2{d&tg# z=zo(YwO;dmgvuXmR0G$h26^ksVP8l5hOavl69egeAC`Xx*5Sk2 zuBNLP)OIG|0kS_ac(0B;ekSN4Ef+Djych#G0O~50=bd@_DL>H9D+FSc0QbVANIZKW z9uj{qH2(7L=U2PSY{i~Not`M|d6MyhyGiSG#00lq&k$WuTXx zzViVqec~uuHxm|UgS}z>plO<|rr~z$n~$i{S5V0%Ggrd}wONi!z!R@>M)(@aByOXv!76G9MDvja#J+e#`Q=od??1NcbgPU^$$>7$I&V)aj-KfNLb55(Cz%5k~Kbu>AuRIV?6GB$v zZOSzX`~Db=2|7wMH(6($K#GzjE>4Px-+1grZ2?C})Wc08a3E*GOo7gjh;;Wu3d&4R zxA6%<$}7i{QL*PZs^+TeZZZ#sl_4?x0a_`;yOcAI3S_!>1eX@iO>lAt!V(yQaajE& z`B#PZh46{CyGtHM;T4A-f%zjoQElSVU^;9RUqH621#)##U+G*t34ysTe;8v?>h!-5 zJrp-UYX|AHf5#CU-EyUaJnoie_|!hLE>FPptzTEm4E#-HJyq&Ct~`ov(~v~GzWi!u z#G2aqo6Z1S0k3jp^Wj$t;KX=$+JFzh8m;So{BgMz%(Ta9PP$5(MB?z1p`aw$F;3VT zwvH0vHog7W?#Q%n6+sEZSBiWNo#llGz$hk2mNxj7j&+eay5$C3!h(FjEsc~p(+Kkf zOUD-Ab4dK=yWdkJB~pgizT@*xj$kaVW11g8wK+wkjUm<{B@`cYP=}Ai`&o`+#LQTK z$I*B{pV0We(!iF!z(;6p`8|hk-xl0x0`rbLr{Yctf>btbr49*iLNv|`&)e2;5d505A#$)%GVAuVBmnC_h*M7LVal%lAnG9jS`% zMN5(MeaY0k-hULvzzz_E>EmSTY$fzQ8Zu9mbQ2vdv%ih2_A(eB%Net{bCU9_HWp$1 z@xvH%S!6u2b2;d&7GHo{cUV_$Xgu*?Agd|b;+S)dzQG%(klWcyR( zG)dv5l$4p&$i7dmn?BcSon+iUV*E1;4=@ka0=ActP7mGu8|+ph7j7okIM_TyA|j_SmZnP zIo}vwP(&?{B4?bwq!x4s1c30*S~w7{0?8;>4K$Lm!xE**&lpIuDF=S9k*)O)gB|`@ z8YSCjkdrT}r+f9#CmCs6LYuaghAaF@VZHk%8v=fbre5S9P+* zu>Hg1Bxga<7BpB0_M{y80KP~iLgCx@#f@vT`vuM6#lxPI)o%;abpz-tm7+2etHIRR zk{0%b_qQJVr^*%@S<#X^R115)?>r`n!k*3f5&#uI8!lxk^1|5i3EB~j^%YPBHKPMAN?; zSF#i^dd397#MI_u(-S;uf8mPqoOXWbf2-{7y{YP5qBVJ{ejio=6f6H)T9KehwzcK` zz~D?E2-*HM9ve*2u(_8ln5PT9k`m?mMc}UP<8is` zDyM!vYE$mGS!*?L2-Yg}HH?uNjiv;mrf40(THGdA+-k(49m!Dy$;IT-tN`4JU(0IL zSKg0V)g)V8aB?R{6JWyO{*yqt-FccO-B6n(6>P!G3Qy!cnEt^rq%WL5OcfwIiI8&n!iZ$ zR_dZB)0x|3qO@BnKd>X>!m!GfLmlKR0p;{%({$Ygh{Yj+lk;yWwX7>~_swWwEgVQQ zUsS-pdJLuGcaRmWPSAijSnb4HZWQu(g@aQBJsQW+tBMPNh^eakAl}zi?0~f3em1$> z4o$fBaBHSVz6m_nx>NyGq9sC&!pgUXOiF%f09p7(NPxUE`tg0E#lH3H#GCibfU)8+ zx^VD(J@k$Wu;Vx_3|0Cl3TM!u732i5C|b>Wxzaad+TTQ*A4}0sc1~Y-broN7UGyT@fZ` z=8_4xtMtx+g^x`Aq+16-)4M#@bLn8Tq$rZR$p(p8mGgMU^(Gw}4(98l1!gH2byGya zNAlxeiI;`Dx37A5U>=S|LSp!k3h7J5P$S>LL)7gAU%x3NuPtLvN&dj@w-(nR&djbk zWGAfbkzPH_jC(&Q^Pi;%{^)%c*UO3Kt4BHS|&hM@h$HNb^E1>uYU^X{Re zRo|y$rH>6N92z;|h87ixx>2UeMMzO&!><+0{{m>2eB&)AD?u4eF8;pCSUQW3sP9k! zjjVxreVo!5gUK}Zg*%LV@6=%8cvN>l$p$-yrdjt}Lao|L`cf`wOzUjVnatSqga3qu zVx+K=qC0gx1$1dVI-`)Vum>MKl6sBjCz77NA3uf)RWeJw8|Zp%8>u;5(Gc@mBLp0% zOO!!>oNy33->+pm!8~W0d*{}VlDT4Sn35JW?>MNrhaa{CX`~Uib9UXda+FcOmX-of z@(!xsep0TNFVlyM}1;6i>Ba|=J1Yd zx`peacHSq*$rb5JEKzRi!{@_~iT8f4q4Ia)n%Uzoc`%3x!lrRafq$MVn8^SIW2pV?=BB1vNn3 z23rijufXqLJz9MLT0WT|JlXl^_o2>kSd1%dD+_n&s>@Rj20H-lD^Xn^aAR9V75~tp zvOdYwphiOy{)m$xp?FGY{!t80%vv+OfJ8$Wyu>iVknrZ1a z?x*dr(=?7&$H_Dg1Aosc%Yn3)yl`!i^H*tgKKkCLXJv9~C#rK|h~#l6QK^{f6UDpl zRh7kvEb0PF6iN$-Bdgej!uKLGN+G;^!{FdJyG%Ykc*R2rjlks_sTNg?MFyorGY}u^ z8}GwybRidU4iczqHQ{4#Z2;x#`-wbcI+4gP`u>JN#>#PF#z=jy9)lZ{@4qPSU40*h zIGKSFwK9e`E49hd^_a%TEj$gmSZdY_Tm;PycQn^94B#XZg|;8{q80`|cU_y3SA=$$ zwUM^FBR|FcCe(a}dogn-T&L@c2s@%IpA@b!u`W?qY!_z@j*5>h$0%SNOgo@n$*1y2 zF(CG^hPnFPDm^!PxdIBl%u%Bpk=d#v(oJpuyinRbfCm3kx7H;tH{hIfgK51G%_USt z#fb`5HkBa!$Y7xl-2t_6uJ(O+(m}VM4)IxQ&@wtXMmC)3Dgu`}sP?0S&i3Y>S?&8J zCE7ZYKEy*XCJxNbz;UX;xxmCD`{^DfgwA%osL646o9GR6@?}dG8wBFhrD03wu!cR< zn6}o3!+~$2I3Z2m{D^~C&Q;bQYta?Hreb##*@u6v7&%3*t}I9rSA_2SUP`BH?pWq% z4po?6*rv0v|D+{_wz4}&9~uQdH_HtH@~siL}U#A59Dz_0Y{n@O&cYc>kh z7sSFRNek}+#jahGwn*hxWt`M^cq-b;iB_J~tu!<4_@(q7HGwZ40AH60BcMtFAL)5{ zi0-7-?`6-dnXdvXliRGvvGBRv40Szhv0HXLUz~K@(A<6Qvn$Ej( zML7Y%N6b;Jh>>G+Ge}CprgO72=2WR;C4GnYvi5^m(XIm1tjq!DTqfbo+W}4e*uVdA z4M>Cv!kS$|n_u^rJ*y?)ikgOmbxMi^h^+P|HlbW0b}=Ls_*tckgZ> zTd@4_E(}aLkE`lEg+vkSO0b<&EkPX!Y+^>Il+W3!>io2SdN7RO*{@ z5R`Zq2YHzpT2P3xA=3}x&xa6!&l_cxtjRKL3tZ>J>`bx!0*ro+lzK) zt+xuLBq()N60)+i6ef9 zB0sEAd^3w(9a$KCE{h^!(RMrZ3Tu?uVy*m0K$nxI2ft(kJ4hn8mU=qQkB8t7)}urk zVhVt}K67W`l)$`M5l>?hC7;gEY~fK}sy@B(FUGkCif=qfP<>sITQD_zLxb#>_54;W zHtyh2k}`mxm=S}ZV0-7Vx1RF?b(r&^cg>gne(W@Xo=sj!w8AAr%HgT@AO}`Df8!fc z0^1VR`LyQcFxYZJ_O>yv#MXmmsgreU>3J*`i!$f4A z#effnmVK#4X^u1Lt%?z+R?!PD@0YV} z9MM?k`zBK-K4%q{w7#s!>OoO%eBpme&1J9&_HiUcM2k_OUtRlr5&nt2Z2;F-ZxOH0 z*i}+nUG36z)RfTuD0uO0En>jM!9)%oMzOj^x{t$p$ID*HJST>M7OD?DRn+xmVu=Dn z?`ss2VqEJ~E^GA_99aO?(Byj(<(R7PP$k42O0j$6JiP}>z|p2|ytGAn zs4IjT=7_%GwSfk#Mlkv(z;)r*pFS zGM%PjPU7I&Q#8nXq7iXY!HXZknA^8i_%$G?I_0DMdtumxV~MCq<{2bP`X{C#*G$(v zpD#R%#j$y(k$cTqhlHgdM2*N$U%kPRp+Ml-iIAw%v(J%)k;kAXw^Ps7W;AcBkDT+N z7l-%jBZ`VVUuN2hnpzcCN-tYX#!~K|`0tv9%l0m`!IRJPnuY4q;5ojPqAwrxb$~7V zkJt>hd3r2c9VKpg`4}o(oYmDf6M&`Mz3dK--h!tX^S5fg&1tW_oc9hqj?qaqdz@&O zUdqcpomS)qL>xlSm1)=Y!9KTJz5!iXuLgU~r*xipEj5Q9VYaddX}9&*(;e;d@v6Bh zvCa)l94r&tHpC55zL~GPy{6YR-&`3f^Ii56cTtg>7w3V>43*(|IhmVX7^%rf_HRZ`VufgSxJ+$_bR`rdJY2tBP#-zK&uZ*n_Z&Pje*H<`3 zaItQ?KkOuQv8Lcp^Y4u4F3y4_sDBIB&!K#r+29FhF=_MKl0^*CcE1n?jzXIRL2V)P ze0|sh?*;;!B$K*MzF#oPc!xwTKv<%eHP*frcbbRALHf zir{~(_f`Y{S}p$b6!#ke;N9X#Vkt}$W}7u;b1;F5gpq6(fX^ZF-GBGyfCn*QCUcc` ze|x!u4P*v1nE{&aR^7_HIbcCdSOKSKeL8Id@5YA8!D9oQg8QslQGf>y#Ki9BQBNmz zuz_}fqpSc&)vdY~d2=9wn85yQx*B1J4TL3(bnO0E7G%|YAp(2>1(idayw7@ZGp9{Y zNarK47#*aAs_k}C1G0$%Xi5Pz&8TYA64Ln!EXx19^5q~kcy~5oWbMzNoS^O5;9U;_ zV$%2XZcIwjze9@nDzI4i^BnFMJs_J@P&o~6r*-BLZELTO-!QZ&2pbQ>-OO}K;i;6n zwIVbNQ;vGmeb6Q?nJ12Fe%@Qyz&gMQ8UZKBa64@P+2n%CS+N9M$tc64*4vpID#s!b z@RgE`(kTfoy#*HkpZ2~wtg3Homk#L=X%Hl(k&;HbLpl|Z?v#}7?ru>)q@@u=Qo3`K z(v5)Rw+N5uk8{6!{=N6C=kal~_MGp0#~AM%bI!Hao{QkptmBnj1b>G&d}>pGSu)%| zo`V-7Ll{w9QfkJK!9LGV{6 z4#xtVQ9QAMh58ItGzdV5e`^HJ2;ottKz@7{pn5P%yQg)2P^L{#>wvkKnAF9{NccXW zjK8ln$41h$46GUKiTuz>W(Omqs8lvmpcaN=Xh4V(crgU-`#j+oT~R|4Gui#bch*2z zYJbIE{Fqjpx4!D&CfyX0F}g3q6Gibb>k8!-<3|k@h^0M*^KeD}b(%a69|O+}rWvPK zRFMVv>@_Gjp1#a-RhR|UBt0U}_&EnT%oQ6GfI)HJcfMrEkmrh7f3m3nn}aaS&cg+m z@f-i9BZT^ZpHy)OpoS=qVdRxLA_%mcMe9|GcuoC=+%*g6=KFWB$R{rJ6wb>77-46V zKZU=sz5-?r_m1}LP)F`)&+JVl_&?kGfc%o+iM(P6b!#&*O9U&WlN4Yn>o~c8(j8V; z@J&Me(`qaaY`~p2+^i9W8hHD-`yV9TJ})~{O(FJqU1^#g-r{_2p003#f`f4 z5pj9=O=FB|(9QR*t$3K>1H}8%!vTGH#7g`&gVr46;O{R_t^rOJ3uc9$!vu<20UWPS zUzdHwmkfT*3tp7=MjK+mN|41c*9N19t6fGPaBvj18FDknwS%MH3<}(Yx!DkbnC{KB z5m4D!{V+lw0|1i3>QGi_*WS5Jc$~?<^Ts>3St#*o+`*#a-W>I{bz*$R4{s#;vWx|F zgzs7t5b_8&nn2I`;8lry2W7}+q&q0vp|0J*f|Y*~>Yu)-fS$v;g9ThO+;8( zGoro+e?ZuNg&3e}R#idWS{8!!1{?4VE^mzPII-PL*xs6z-SfXu>N5e@8w1L`5m`E3Ui<#$b{kVK6hgaka3Lg%#fN{ zu7fcE^WN)5u4cC)_XlYtRJJ=vE5R1ug!zxcQmAY<{r0vyeuwT43rSE(f73vG*0&{N z8@BKI9ovnxFbH6kYi$N}m|LNf53l~!2XH??yu2|uyjSSPXM=`{sQKv}##Q)Ho`aVs z?SPz+Et~{lbq~n9>_FGKK7E-L2Mw8tyKlM+W;WeTx*pjce}7Ke*A4d={-|CERrnxJ}p$r&<4|2i#`yn7Hr`7V6Me_pig5 zO>FlorLm0T`u|Gg(C;rjbeTHd_YL!Fz+QKk+mtK7=V0!j{M6s>4i-to<~OS_5`_r1c{D~fv~|}h3z}h8$gC|@(VKYSF!LG z&VQo<*Mvuu4Huw1N`?;G{PO2@0bAj_{lhle^5FB$902k+P~;kAkHxvO285W!>T9d zPZ6mb;19smX1os)6|j~+@Kl%FNfQ`LGy1mKih0iau`UO9;JnM}867a~plbRFfT^Z-E(*N@6 z1e6s<8OASy6u$_Xc~nA=xBnv8dt>Bf{L~zOncgAT;12YXO6I;Z3K?)e_Y3dI7Zk)TWM7I4olx_c0L}7G`no#h#>MMfJJ1Y9JGT-=R}BHpJ+r`HN(qNr_1eQM8?Zd&HLY% zMIKW<7bSB&<*|9L%aapKN(hm2k3?uI6dW@|mq#I(REa;KY!5zCygH9Djj9EWf)4VPxLFG<}dSYq``R_H5)SNHdIdn2!SyS4cYwsN&O#hT_Epi!0==g1%R`%|3@u zxd*`8M892 zjt?1r;C7fVjy(vAv8tFSv;p=aqqJY3&)osKy#Jn!X zfCT8^5(Vwsn_tCBe--0LdUAuoekqshVjjPWUCQJd4dNG?CDgA9Du6cVCnUm$;bH;h zT?T~3vOJNQ{J5kJ$|z)p(*LIYB8XqWmpZtvp~QbvV_WR&l{s_7Y0FU46|U$uD7#)K zf)v~5$Z3a;)7pp_K5VCxo@sFUn$6#4_DG~_cA^sN(wer}5k4}Ofq-B7Tbz$`CMyZi znycM!5E_CL!P6L#+nFK^u(9kGbD@i#+O2HoF6I5<7BKCMmOA1z_t;P5a5-ht+Wv5q zs5UW@GqdJ`>tw1l;S9l&>Rr;V!AJK)eeSIq`V(b$*KmE29*9&tXW>(5t#Im#v4xdM z<|y~!7EQ1A4W!p*`CJKQ_v(wkZcyiuER5NgvUpg4y;SpmRD{^KR~4Ms*o15D>XJr( z66bo<4kDnvfXk|nnV4rcui%*9XrnI>Y+r3k!{6uU^R@C);B(**lo0_ zDE;YB@ice(1mkDEsq4vBmI-N<)*POTdbex+w-fvTb9y7BY;vuf&C>M?Y?s)L!n~HH zU7a-j5#P1Q1`@SluXO^PLk$DX!C4KvtiUNzmWX|Jd1qcKBF)mSrItXM4vW3b(v6wi z_Jg0=gY65)Hh8v&7XgQH_7`9CAGp=K{$$ux^)&u6Z!-3nI)C-Mu>p4$Zs~XrOhJlC zr_6p_L3d5<=+ePZZMCaDMV0N2zhdK#Zn-Lv<68bK%aTgh<`&K5`W{zMfOh8#8!t4ILqc6LG1ngp?=s-V+@q5gOZ@6+66Jb>3Tr&eI^C_{j^M zv;IZcZcWL;={nkem8Dovns+>;W zK#o0J<|}z#<E8RMJx?bwTQE=wr-l!=Fyu>={cgEWfnzaAB*uZRu^bosSA1ya=W_ zJkS+BXsQZYA{-?|-2AzblCm%d35!1gjb{~FgSXZPr_A6(s#V-~cEMbarWJ7E^5w{l z16$iI$YASeI?sT0w`V3o8@rzLtU2|QiR1KU$bcIsJ}SAoM9(eTusf5J@2Gt7)BbES=5agZgHP^qpsM|>W48&2Pw?jS zwQ2Xa<2~~m&la9b&$<@UIh?q&Y}ROJsD{$H<-D@FUk6*UEndg=iR|oiYL9cBGGu)x zXi3Z9M?OjwTY2LftyzD<3Io5BWZZLQSY8UVw01O(vNbn0ADd0WjDnW+y7j|D?vNfZ zU%k0_Gzag5n9UJ)RNzKC6%he%Sa1C1chUP;lq*aGmS@YTc9CiK&m@=P8O$ z*W6f$!Vs%1%B;*vT-B90a@VDOogWj?M!DvO)e*(1HVrxaq-9XDnpf0x_bZ=GR*l&_ zdD9@^5KEi%p)sVhK0u#iXn1#dh^8 zW?3eW^NdxAwb?AJV%Df2ja^KxiQ7Pq+Xw{eZ|alss)OK^MW-zaj_M@3S2i8qd#l@> zv(%gb-K`Rl~xfs=x*%xP07LdNVXo!TDk-qmgYEp_vSWe z&^WF;z!h6-a4;~^>t6#qSXi6b80zcW+R$rT>zmrpU;S~l&kfz>-`>4l#$Ol^!Ddc$ zwsc&=QZ^Y{-VHoEeD-4Eg)IuPDH)^Hf)1zH$pMC~-+dTPae*|qikboJW>2aUQDO7v zw9t_u-3kT^BRe@x;Uo`;VIQL7zHXs$=-TKyz<|Uw@2E>F(eWvXaHSf^8Xh}f7f`Yi zm=nhvfb;n>xB|ZpMzC5_T|ct&>0#1i1^ncQl^Irf{2mOMb5N++8ZD0yXPD?>7+SRf z6|@XwR`^qz2dsPDYt_`!&r|8vc8%_X&~)3Vb=6dqG&KgfmPf`oiGz-jcyyXwZBL_# zwo@QU(`2AA_`|EmR`X?8K!88~xg8L7w(A>?dthK|te4vXQG)5(+1Of`shFA48`7#k*t znMmzb(W3a&MQZ9So;TEJ)oxBCS2IL)Zmz-c+DHltFMboB6AAo}c|+Q@2Z=NhaIJ+z z+y#r#uLEf>ws#<3J;oOa7BoF6p*VCD5qQ-2MSG-##^>Fs#YPs9oapebV(xm9a9c9W!&2@B51m&2hbSG}_;gkYdo zA0G2T-~Cr6uUkjma`K+P^U?C=k$#EmybjTtf$N+a7VvbStO^(1SED&xZ9uS*QcwYV z10$U01y6?OPcq$rt?XdgpYw+xS9V#47%?)&XfD(i6rW8rU!<@H)oK!yj{|f^IVI#t z+?;seHK@B4*%(W9ng&^(eR*3Wn95<}|AI~vC4mrMP0(O0Cg7di>5EtHdTP*(67Xqh zY4oWfLF}(*#0Q7mL9X3&IvG`v1m_#)<#;^{UPuM{bLg%w)CC#wz3*etvOp)WDt%`T zE>Fnlk-~VcfQoJMI+WHTfF|3J&iejSa(#psZAIjPR$JzwULb48tH78bU)sm!+i>k8=yJrC5dy(C&|VV=42H zwJ6pk?gJ`nfe}$S9Bg8WOB=kCsn0kSW2`zF8}&}oaIhVF1YF*d=NN->GJ-7z#q9kZSzNx;h*qtLX{+v%z*!(VjBmMz23HaC-xuhk_x5ydg?%3z3je&)c|9iTR|#aAXszD|x11m&rO+oK@FdM##cR zdwN^yEAh4j>ot-wXTqpX zbXTgf>gu?1ewa}(hGtr4R9h*+$w)xnIO&t7Es0I+%fNq{o5+Q0lURS!t8>;tVA1YT z*XP>S?_pdjJD5DN{=d(Gk*{l8D=N2!wHdj|`?9Sq(!xJCRyHSFg;N!EHZFAb(OKwIfaqQiPq!cr*N_T%A(ft#o%) zdUi3TX^qq8fund`)5%A$`FkFl=`A}ZRF893+ke=gc zW8!X=E#kK&F1CZF#j=4W9Y~K1<_`OHRxO;W{=ygk|4b zSpTB^8TjP#Zfn8QGa{w@FP5Jh@`iYw%g232sfl|MOJJNZ-4S3df0 z8-&40jn;{4!4fm`Q8THE%^aYE9rlwW_lL95_vR^}K=VNFpRi?)F;Dfr3Vfj}N<}aw zZ(1-BXpTeJ5WVLUQW{-?qdD%`uX##S0xH+oM@nB6e7RvThq&&V+P3El`v@(VwFXU@L|9~Ap$J*WdCY@3d@GR0t`S8zKW$rJm2h#fY(qc?62 zb51yF&h!u7`8TqRuD#1e*>WFR=b#wfXp-pNy|Cn`dzWpQ-%4;8d4uI;Ye?1Y!2}Y? z!3;@_4Lal#e&dmX$PjywUlsc>1geiUOA3|2`W>$kQ9Zp z3zugUdY#9zX}UCO9~Se>SD|<$!N~;IskW5fr>o?-c@YTEx6869486(=q9>+!R}Gq? z@+6hV#B&Q;g#P#zu?rav)G}f%`Ice3>tJL!h{+_MEa@kMz~Ow8!Ve^*N=KicM{>!@ zZ8pGWD;}qXdiah8B?)G%c_Z_>utl{fUDPd{Nu*?Lk)W10{Q-+%i^KY(5N*%`GLTzs z2=~MuHP)3dr$KMTx|SODyus}o=#=$qp;qSyb*8@Uc8B}UY!pJ{7OypB+-!>PC0QJX zQ(}c1xolkSKo1^BC~rBXpa-5$fnv359cllDW~_U6w(8T1*l>!p2Z^LrF|Tlh7%_N0 zILep35Au`m;hjj4DIJc4;?_;e_ZK%6$)-dih!icRklTmqnG>Y;&VJC3RnK?g`WfEQ z6;U$%etB4iny*$VRI!ryA;U535QXLAI6lHk`T*kE#|fG)7gLOVOyPNTLF-h;>jy3} z>@&|q8Rpts33=*{_o4fhDhn74I9Hy&()q%Tuko~<2SzGKkCCDV>mzO`7k9d4p$cC3 zVX8xZ&d6o>0+c$VFoXk^H4tvJ^%k_6vLos7 z@5^vjtrKxKWps&79UO|@iwu8*C;XbCfqYON5ue++23gb2OUu^e2pA7ZAQs9rAXUFgB5>y?}!)<%J zlAD*rHl(PZ=$i7S!x8hrcZ#_P?=Y%QnRBQkaW>ZA;J6#d_tcijB;P`VIWW=od|Sgg zh(BvuXd~Jz2urr@qsHE3bq;f4dh9kl5HMSmi}A%shQfC~RT^=LJC)sJQ<}wAn!6Um zj!sxg6iXajs}vGVv1KAbr3Q)C7I7bmiKJeZe7go81_GAq*o7O{72K$vSNxHr;Te5OgRBd-C zQe5tB*Y*?g~&SYnLyAS2NY$%TA#3awK+qB?{i zghB(-W29d_eeozkAPiE|G9{%^L|Mh4lGV4fPep7#4ug%g!q5Eh%pW2 zL~de0h5qQ-A4R*|JNLxnp4=it3wvNr!N@Kh5r`0$-y_;7^%bH0qgp%sArS)c-IPWQ z16;10vAnphpzoA^ujHki!K|Vv9@9d{sX7i0GkQp}o-{wC=Ca=|H!5#b(d@@w_j<0) z$X&xZG{~V*+NCe{@RXR)f`5d9$n(L4Mk@l}5vTbyV9GxYrIgv4+6BIm0s6IUsSV4 z=#NRZZN=!R2n#l@4f`5u+7r4kO)JS7zd&9dUd2VKB~Z9vSqN*r2c!4vp7=OY+*#(t zzLp#k13~|OO>C+hvV%ttyjY7o_X69==DKPU(lz%^wHnfQKUs%Vu%Cs!EVEq@^O1~v z0sIcfpug|5`bDIvfATg5sk*MCj#<|^pOWjI_raaHMy=mfh!^ms1h7@^KZV2mp9rTQ zQp%!<0nzv3UI(|-fOkcDh2h-OY_a*Gd@BO~L2^ZO7+&|!qpdIc?MJ&{8^Vax&6Sp{ z;_Kx7hihWnX$+XHmz~!RXgSHhm{hDL8gW4L%8AC#tw&l~ag?uz_m^Rk%y|g=j~Ox^ zElYLuhBe{oMhHeM7^iXYO`R0 zoO^p7xv6@JJpuUy#3My*9Lu<`Rf)g*MCJ_JMoh_LZ;f1}ZF~(GWtn5^ljxL*LkEE} zoq?^0|EY6rRdEa+ATFdpT>g#D|D)h!M_gXyLG|A9srTyBjL>^rLNMojDqx;d)|*fA z5#5UnM~up+-{GUAlbD1wH*M+5h6K&7IHI>b(~W-JV=%?=LO3dmrB1@ueU}&Ucv$pCq1!rTRI_1dQu2jkZPe+h$ub>u)1=p~}#?@x=sF z8zTcL?+&ynC5BmF2zYffA~OqkKJ|)tF$Yt$BFAZ=C)uCoKTxeuWVibAvv8yWwSV;^ z=e<`>W!QTfxoP}<>Kwu~N1I_mE71;(E9`RJr`Q^eFq!zDNWEm_T-J$+cTo%t%JKBL z!uBJ%#E58*LQ4B;&Uvb+^%Mmfx8)wJ1PTyZL6dzgk1d$`&r>YY-oVUp@G4H|Lf^UT?=dd z>mCCIPMHn{6#4)A2$pY@29j$X=?;qGruw)v@w*BVa8HD&aBSdqeyB2p89EtZj=Rjb z`4qK1U&q4=;FTa+Tn)$XJC^ZMl!fV4m_k&&af6>%s}wB_O)Yo|rFzF^KEZuZz~582 zI}pV&iWvMw#DM0h{BqXkY*!fjMjn4)FJnKH0`D{!Z{)A#Rx#6$+L?T*Ejt_^ z!@V&dIZCh>Ly}I&i(^x6w8Rj2K!uViy=&joOWfv;?NvNCe5TC7rxb{bH(eIv+(w&0 zkGxFu5k^OIWWZ^-9qt(8yxPTaHT9`n^^beui#G5$RMd=VduJ?@r{B*oJdXEKy&>2! z^)%e*H85z4sru|b)VQo2Jzy=j>i64}!yG4bvh0vQYE5;HhFg|*RPznfd>lQ}<@gO` z&Dk~k$@nlcts?A^t@J^loN!}OfrGX3>x8Mv!cCRbmK9TUKbtD?NSc6B_SYsvEUOlE zs~AH{(-%1OC8hgstVF^c)~MhR<`cDe5am8qB{r>cMWlBPOEQSa`<eTNMPmi;?;D-2DDo9c9AVIoy{4G z>c8zh4iRaQefhdi%GcOdgW#y{t-dWc5%;=u3Yhv{`5Nxl8+~!-CCxz0$KCZr1gye6 zLZr6pwmt28?cara6iV%SXViktppi2AK0@0B_0pR`@u137vz+D(J2R-k$9=?Zv5q8+iq?(hkcyYB zJp_Y(;pfOfL5M9pjb<>h7h=%;(>G!#F zhJ2i}++|yA8X-AbrVcS<-}6w5ZD}3ra)w2YDgLrsdx*h{n5w%y03lZuiYnxNLNo(-g)cNY8W3#B^(L=$*C~gZXCmQgniXexpj6( zC8ZGu9}=vhkQppqge22(vc{!Y#fNv-Pp%DUE^Y`td>zix;x@mNEZ;d$fzcYbL z)p_?c20}0*!pzjna7It2bUUI(tT?J-)dp0~l-n{fe>GA_q&z;rl6g$C&IteWJbQ|_ zsbDjHOyNoIa~8_rP$wc0NZzHbAuPJ+mMtI))kinIOJ$#EV%{V|waJfG_bG(CRG<+{LGtB)QNh(Z^uH>& z4FAmmsNnKWGt7*0#+Ht)cJcv(c))-J&H}42LLIJ%n51r}intNT?QJgB<$Y!lJ&T`n z{16heb07?>BGSFAtm)Ri&p-En6hnS}scT^nXgK46=x1MN>}FXZAM3aqpeRRz7cbba zWnzy3(|MmPSf5E2SxG!WB&DEc9PLL%A+MbqOS&tw;s{=wW&^mLQ+DKOgVdK90>XA$ z@T^m`jHxDpS@iE)k^w=cd;Tv!BlsGasK+?-e+qFs`FI9>mkgZuAhP~98C)&X{wsrD z8UX(PErSCa0mN4065=r`TNC8zi~3+!0&oZ)87DpzX|3yfEBRN z0nGXRUYNhD{=JL-@2ZxW*H!=CQ~z&-zkf6N8=<)k{NMb7@^6g4pWgY6;WmB6;(vRV z=WoD2A8z>#2L@II0>A4~m%jo2yccmBKw$N6fZul}{zm!p^7L&KyY;_Ou7=IO0sg$~ zdmBJ&<8Oc~8h4`nd9m|0O5x_;C|7CwZyJAImAeffy!|)86^%Pl{=9y48)a_imQsFQ zP5PU}pX>J9)!*;ms(!PI|GV~|i=^ANoepo+zMj_Jl{5aF0N(}x{k-jiyQaf`llgNR xbsKB(xVnPQHaV~E*fW@cu`6f-4eW@ct)#+aFz@{f1l`*&}@cXu^2 z8kM9{cdM$@-BOi;G&lr02n-Aih$Ly$7m&XdY#{Dx$q2C5cQLazarj?^nZeb{^2emM zbvF|N^aa`plIpsdCN`P~y3V8=6VfKRHQx8=VWgZ@?2Z&NMCiZ$ofF1I_pH#P`f zv;_D!$_WJspoq*vphrT|=8{%IY%-8c_J4GwhCoj+E+FfcpMOCfkq`Mzmx28I_R&Y+ zO_Tri^~I~nlY0=))%DHs;dOVn%FFS_^V-YJ=k-PZw$XD?y1o48S%vPEkAN4iySJyN zj?a=xa|dtng8Ajt>+NaJulk@nz+4eS6@%ZW{%u$Z+Cmfj@nJBiMqz7uI|U|Su^uFGoRCFNSiynpPmP{b=~5kAF1BF zJY1fyCXBUOjJ>^iUM_DY8I~U`I3t{XIIsIW@4srpz7Yh@^~(b4qcqnKe4wX(SL9_n zqeD!pxQ=P55Y69?mFGR1kDc%-1rF{ZX9$*ix2~=U&<)5#PY9klT>X|zaw*Zx zK)UXvM~GXo+0dO2&Y2*JcE05h9JNX6_<8RwpdNDBp;pqd@SE$cy8PyGd;7NMYV-bv z`5urJnl!hq_judKaDFC0kl*#I>vnA9bYl0xy)3lVc4k|glCkO6@ywCnNQl$<#7N8T z7!TVwxD_Z%{*brxnXBWw0f~-;waf*P<=;*CE+%N6k1safd>y4{9wVoY*NR>m-feGo z_XcV%SPi;5?fdmlA&pfv@?ScfHxEQm%UYT>*7$AS=rn0*2?_Kt<(e|x=pT;Eq@ zlj(4}-H88aEJW*=FY+nMb%eA_-_#pOoZzf^VqNMv%z7ijdgE#5CCw@z*%h8g4d!|B-;<{$f7@q63>&<}Xx4cs8x9F6`=D0ErE*eF2FNu6-d% zG_HLSNd~TcF-ZlkeF;uByv(mf*9mCE4d`GktHFifbSnx#iqd|NM_k*uNQ_LEhXXPy zC_r6!*!eV+t^j}&w;Mr+RxLARFPDg;u?L{euC3!NTg*tL4Mv;2V;Vwoh-Xx2QKiv! z;DDZTk73MkjHh2Jw^>=y?M|%>#E5xiFNL&({|rK#rHri(UjsI?IN6q>2rb z{Sy~ibgHV`SNaJq?jad12s9NM4xA4eG9QUA8Xd}2Koxt_O-rxa3*o{ue;M>AC6FnP z0i>$|>G@2Z*IN3%`|y5dAQMSI4kNHdyArmRRU{bblsIf1s0<$Y9F&4p{1?2=x*>F! zK@I{)uzFcFU*XIZsPc7xz7PYnU^#{R z6YNO=T9QCS`t*$G=p#TY?49TiBo4hJ-arJF3yAoW>hY<V55?)e*`Tg<$py=);NWLM@f4ZM8i>ovj(1Lmn=Ywx-ksc zo|8F80nQq1`wMj=Y{b{RO$sJ!psefJ7dUIscVbWjic}Z9-YN}bgRfl)`f4|V9FPcX z*brlvw~5J8j=uVS4PW22D~Jpy1P0*Rm$Tu|#yFC1Wd@hhVnDO!Y7cQ0lAKEo2qA{4 z2_u;gwkp{xh#V!v14S!p@%4V1B_xB7vi(qU@NLRhwnt)Gab$Vz^PD+^z;1MrngZQR zmy_h_ES;g2g-&+iNr5rkI|R@~G!?`RF&Ssb<@Y4}@T8y^LLJ3dgO3XRh;{bWD2!X~ z=bM$ZGNd@lt!Kt^Qd&ul^oR}2RrZJ1PIop<=c*1`t?(E+3M@SDlmUKz$u*g**zr$9E7D$?`&m?j z&E9<4Oc_V2^`Iar@hfp}0X-p9iOG{sM5{&^WFZ^*EQguBrQ%Oa)emX)gOeb;BkDAg>nQ^gJGzecmzWuLSK29g4V>JyL~%+iJ?_DBZaA$ zHf>Gw0jepImq{?!*z)n0g5*4=QU zOfem?R?Jjt^NYmp(XdqbYOPo!p&RX?b=xpD)SxCksjNgzjwUI7;{^8;+iPu(p~^hM zXxiJw{XO|bw!+!%N~LI0>$iB>Z7Kersz-L+WAaOmIzKtA?e#O4xZhPMxJxJvIP-adiJeCyixd+q|oQd z1QJo(IhkoA^-M0?gLe4batvQw4NrF{BGu+oR&y`MdEyR{bTm!AWHa?_Q;o8Sjjzkr zClv;@h|;glU!k%$FR%L_=^%xwt#AaQMbVnGw`y)amV&s2ajZMJkimG)l}#(jN5Q_h z(Fsjz>-t|1z)9k_i~98<8qJ`9kwSJ`+$h6>okx+ww0eB;ZAD|#$&rUsc=;l&%+2em zE%za0Z7im-DHm@eu2VC~{tbl-9@am(F_w6AIzm(*Dp3kOUkP|-2})9>+pir%WFE-} zn3}6Tr}FhtL#pJvDN@s{QXWp8Q2KH-w_Js@Ik5nO3=`}k$@muTvfdgcBZ7>`XF*URmDwG zVvn`}GE5Ts*^Ai9&GPJuUK0n{OW4Y#mgN{}B9E)58*A(Bw3JqERMaf+Sf%QC7cLKr zR9hSfGJb02SuL|$20xc4@bnjy*Gu2J1Gp)qGw3K?Evw!4d+jVDr^umiU8EA3HGs2) zWF($$ACU6hNUkQqolu%9oE!P?@%k! z#0Wzi)o2ATYLL9b9BkajvBNf)m27nv^y9NYy7(M!jD=B*zPg-7=c`-^8_Ys}Kknp7 zuHB-j_0L>MROyj?D^qx|4q?KApZS4^{c8ayDrWB?h9-+hVmw_U-4hb{xur_!dGvIP zdsw)-J;qU0DFPf0A0-gra6Y3zJSq4Sk4xCkK5)ZDxzkzragCF~)G~i3j_Fq!hxmA{ z~xIgG*9PaEXruICXce8P)3Ce8C(UQ);d5Juba9vT5*-N6~4VGLY5GSFEhLn$hHGA z2LRlpBY||v)#<=jBg|!&6ESkZAvDaNn45%JDV{oeW4A? znYWa#mWtTd5of_KK<%8s_G?Eonvs;N2)22)sTfr)rRxzu%@Q}nj!z_DeB~L8%);s> zVDXmp+k|v|jkPyT^Nk-|$2QlF``4NjdeV>6R*WQ#9c$;HU8nXRWqFrRscK0~{O0?~ zPe%j0`SmR%p>sR>Vc5OhHV?zSOi+}OrdI`QnN^lJAGhd&eUtUnl$Q|Nas9?dCz&LA zAaNO{DnIpLM2%sm)=4e_hS>X6Qxb-3A@W5M84$yB`fMAM1#;xD+4W{)6!DSv;-Ppb z;JG(q?#CP#R`3)7aK9Jsb!;*&nf5Jda`bF=k}NfC`)Gypf@Q^+*mP*~6BVNradLPf zj#!EZ3Jt|?ah$pfL34s5aG8(d6%ECIFq?N5Qs<20up7>%E1sOz-rQLX=D~AlD}GIE zvr^{JFdyL&uWGOgkv*|mF+}rNxm)U8uRpOG`46DfszndYVkKeSTf3XUW2LJ89W?v{ ztoZ^pavA_NMglcDqj6LCZ{(w8eqoAC?rB2ApZ#6TjB|YHb}K z@()JwNhd0=5j{5OoUJ`eoRGq1D~k}qUXh8zW@nkhMLwP~y@Nk6Rv@-3MoeJe_d#tZ z=JSA76-?OEPcvYja869iYdjyOuQYGgbAc$$`wYLEJgvIu=I&U^*zL3dCymGQsJdt% z-;m>Wsh75$07W+u3k29P1zL8ag{y_4%AR?|sWA1OVR&>rfcHrM?vM;UdLi-3RxVpE>)$k4NDl}Ls z8RRM-7HO>w>^5kv^)JKJ@MkMMHUWaPuP*pPI(#*4;`9S`ywin-(LOEfaNv;<3n6gMQLcV%>Rl~yo)lk9@5ep1Dp4a z=2ny@r`#l9u*S7l8vu{-WmE>J1$c}X9g*UE(y&4!4VThw9vtqSX>(l zCVSQiL@1p{*AR4{vm6>`YnA}qKdwiBI9d5~4cCNSvMF;xjJaL;Hu2Jy<$zFg-(yrj z;5Sx6Xlkr|KBQQNad-S&?eu%D&#he7cC4S63LJpHOl~;)6hoFzoajArUJ{sY%ajk$tsp(99MJw5Bx!~%!>rAUinku)i&cxCT{`Ghz zs4kebH8OXsBO$E{BK1Ei+ukNM;}Nc7n`rFXfE7N~_#LPDjI`paU2-%Hdz|`(3?Vok zJS$qWap?RDO8u`GJHmCs_rI9Yv2<{v^1oRsfZ>xZ99=;^hWIt0D%C3&(gZfx%cJM{%`R2_+?iaz}p=i1f;uJ#s=CuA2!3Y7-6kmgNyQ9~8=VDjsN^N2vEXAK8+S>~d-)Ei!wvdv|ogvqzU5 znY9Klh>M#xYX_34diZb%33YtUt_>U$O*68lhD<*TMz*b3j?HkG(=Oc;fK#Q|ogBLX z|6%Sk6sgNkOF4HegnYhWAy*YF{Lhx*2DIG;ptngwn)D>K%@FhSKi{gfH{`>S4iDVP!B$!y=2+j?S6Fh#Y)D#CBk-fd7;cr053yh0ja9QWVHaMAv>fupIB zl@a3~@Q?8AnA(cQVg>Yt?05*CH5)*;_ldhn1&v zwlS%ZF4#6}2rFx6%t%QG4kU8mH#QRsQ(biw6wDp{;Vt%;TZi9npnfsQLCJd&rN7WV zT$o=UqE-NeS-|3X(P&$P!{YnkNIp=pVq&=oB|l;A^7Samx_5n)(~e>c=%jsF$j zwVct>FBqN8M%=>3WgIvZ9*7p67t0V^i-N+GP8}H%h(f)&M|PDMJ1r6)?0Y4WnSfmR zt4;gu17G`!5)vVkwutm^;$^LDs872n4GSH(YT(@-`{V)zTXC89f^U?loHlQI9Q6mIzumwoH0l zO*mUlO9K`%1M^S3ee10@Hmofi!NcsIc8y%W3HOf|y`-csOW?f4UAKW9Y!#ml`FhfP z4g?Qs*`v-U=hykbXN}yOOmG`o6W=yNL(j|tKBsT8R@iY&T9gx|B!zqx7F!`Kjmj9TMP{zfxX{&yf6Tnu^zvhPCuUQa-tZX1Kv8)B482Jq1Xj-eI2XUh#?6)H z_;8gPn(k}ME~j&Xu!e@o^<50djXNg1vTuc?E@QWPDQ!2w2WA&t%I^B{JOl1*1AV~) zFdS7yXvocKiwB)Nm{1U9)I_J^7x_7UkGz7|CBzjRSewHiWzz&7`kjx%ndon=qP+@o zN_PdV>VH>ZdMyeUlqUb>o1e0LY>Y!?QMWX{`qa3UI6p9ge}t7H`T=$)Fz-jP4aU&H z0;m6oq_;{ovg8BI*}?bUoivJXs|;w^`NAAa2+G!$XB^+!j*A7tNg4TGeY3>;kE0B9 z_As=f@wmnDHO&NR*b=*2Tz#U-pR1M6r_)V|uZO;#yr#Bh4HKyCMz1@K1l@Wjxq65& z<Cz?@?pFR~ZQBsEV zpC%g68@=b998C4?jR4Ay_V3B3_ngxh-;zCEL*jY)uwdp5Q>-~v%C|osQo+`LI0*Qi{1y;0#~^vNCdQlZjS9JxtCN)a@Y z1z`Tcq%)hEPEl%{^j8g=_wj+yBghtqw3_tPCzYzvpVN&O)l%f!bf7q^mwNPrv!=+& zaSEaYM;3C4u`}W)XcS5#`#^>bGK{cu7LNT9l?O@ukYQY< z!$8OmZJU#Zs+)$3mW183#+6~HZ6j?#X9tS9^lQPbXHiv`A|Qy0o(?k;DWFC1dxhhTd$@m^h5A zarfPV-Nf+&iV7M(gl%m@sF}CARzHcy*3(_qN*c@owUT|+b2)-;Q4oAkoJA%Sc^x{N%{UQ$9g5C=+hLwX zb}8^~gum?}5_`R1o{e@c@UDfw%>mX9fHfem75;V`SbJcel?U>w;cw%BH2~=mBhz^> znH}!)A`Gb#mRk*+gDvLZfw%^T=Oc1|Rn&m+AeyzY%{6&Ipp+2`lZ=GSRV{2pMJtpj z8L9#tO4m6Kg-*=)N3HTgwHy{YG2<0Nho)fL!K}T=?DiPAuT=5R`iQcx1z0DLf`ASq z&`fn2{~OdW0<1uULMu2c_rdl(+Y{*+ke5#hzS&8|`LbPZAt!B(7=B*u;SUx96SO@Yct-pI7Ug+vf2(`e=Bqp?n7N z+RbD1I_keSoZ&Y>$~uwhSk68BK|<+;q6bB2WLGGF5UnkJM8dNsIx0h2AulDWq1Ou~ zmYjN|Ly6Bi?15hN0UtE*ioO(nVuv|EKnpu{;^78C4%4ys7-at1hx2H^_RM;!TLS(V zws`Cnv!0Ep9lU*FVIyu+S2kT=NWGjh`TGdQ9H}0)%Bu{_(XM9noc(Uean7+G{I1!o zL6H`wCu= zbNZKMpIgb=ubrYoDwK+hSEWfzYxC&S(!+29k=9AlyIy1_&oj$<+XkUa{c#?MYUHcH zaomK&LF4T);V`4K8=N^_c4jqo^ekEnnS{yxzY3jDavlT3kkcVkro0_=0PG`oOd?1; za@=6Ny1mnA5*@aX*zFDXhtT^St%9qSeTztGXFgSexK%a89d}RI(9>VLK9~?8<1K%~ z^YbXc@YDXr-DvOXV*7TsETo=Rc`()eOU8%U458FdfBMV zhvbU~Y|g#mokKA{$5#Cov`~(r4jB%L(QJtr)>CkbJbQY!AAWSL93xDiPht)nP0Y&} z!oQK;-_rOhA#0bQ>XV^TDSJ)K+np*XmQ=g~cc8BL?Ryey^DmYybF}z&yczK_cphOW z18p6;ONHqCOe?PE3C|zcacvV@Psbb5*Q}YZY|r+Gt2ci2rsqK^1qBXd%{X9hs6oo^ z-4HuID5*Evugn2fe#v zMKCqx`*baQUW2_jw8CI0DJKcX%4jIO^`Uwbite4@DQmf`3ET&+?0RsJ1Zs_I+!!~^ zN?5{-s*wB3r(vF-jBNaaS3~W`e9+Cq-9?`}#V`7&dYW-wgU6$N>a$;$n=616jVAF+q55a~16FPjm8kjC#9&r?o#*F6ym>3n2hxw2B)Qf^i)9 zVeqT-d(1qoT8&J`!*5X%eKBkh+RE0)ZwQnSC21%;=0X%96 zhe27~$K6@JY&!lG(X^cOojd+@ZN+X;Vkt)iNL;aKCYIgtC(BE6?cGBZ4Jk}c2J<8y`2oXgu6qKO#c z8FtcokzE<7AtaXKq$h3M1%;4-6aF1~(+$s`Fb0Y1A*Zy7y+WTv++w)>b`2!RC!73> zB?v)OigGVK@lgYAo$rt$1f)g%bVE*7++jjnO<&QMj(C3&tbN5#_j*F$S_tbHF3VuB z7{y1_v2Sd3VE+Z>!16;}-7Onu_nLxF7U+aJIP490*^CK4yCed(nVgo+!bj=R0oyL$ z8b8~bl_ELzP}L=|*w=ef?fueH2}l6Jsi-*`Xe@@(_}OcXS@%NX$@F26 zTf08f^Hw^J_svr3b0x(*-Y$Xt?8i_co|M33!4dz>&{`Rg3CUQ*;G|X4O%!*8WI`H` z35}=YwuC|g!z#18%WtT+by@eC<6iep zEy1zrUT6TGCb%`<}@sd061+Xi~lFdH##Z99t%W=&^uU#>jmgzx4!0C|$W})VObHS1uC=~8N z-#K0g3xV+dKHuO+>ZNN#au(3<%jUE>;QgSe)4yqP+FmE20LX`L?ndgmw7Z~8*p%gV zCr+e(7`1F?f^w6f2hcP*Zm)|E>FpK{7D%1VEZ2*Al!=CU*-AHCg^LZe$5|$q!btbH z$B8vy_+}F8WbL2tltG-P9wUYr=BEKTW}2&=-EjP%^XM)&kFFFXyt&6}84F0Xyf=m< zS#|Q1omdFGrV@orVPLq?3{s~HdJ#I0h36WuFx_ZGFtV6u1(_ycP9R1!7-V$|BGey; zYiIc#*K*5EhGuX>qSH&~pKUu!6{IuKR*Wei++s#V(TT2Y)Gwd_eS6s_dDj(RrXP@= zQ}c}b+)b|3A5`Jy@%_fh*cVK>jRqnNaQo@KGAvcIDGXP4Ocev-hNRbU4e3{3hDY}H z-RhN~@5sX;5?f8PsL*A&t}9H_QO_-5c^nu;WP(lXe=2UFaamtSmu*S>AD7nh5 zX7>lYk-<5YAABJu9AF&x-}RSpXEfbw3(*NMU}!{RI`D)aj;x=RKd2(TZvppQwD9Dy zZPznm<46$y)MB%N)b8bA(AQwI zkxn=>N4a^}S0PwKqf|idDW%HY*ZitWP$88ryi3^4829wmlk1}ohme5F@p;Sdb*d>O z-Y$Mp^xPU~wFm-k=d@kd>4(M*2w~Qi!^26p&&gdWzB_f>%seL|Azl`q62*r<{T^fJp6Q+wz1?hqa}Z<>J~y~M zMK2^T`=4^N>YlI*r4pxGo5{z#<#1muVC^Mx+QM`{|>jT?=ns(tC;$^Fj% zAlZH5!dogxg5~D{UC2p^bQDT{(urtTi_VuBfN4YgVNlsu^wVGi0`3jM`Yk@mJ=;kY zq!iCD%QN%n$;<)*C^$CZQWQ_pwJ3rZ1NNiBn%{(PyzLzof&%*wW#2JlXLj4|aaVjA zs{*P~xl26N!*CFd$y;v?MVvvt8Y_L$!^W*6OA=x^ZQx2;AxD`Z#^Vy5VGGeEwyg(v>*$w$ZKU? zZ%$Q(g8i!K;{7cIv-L~fE32j>cPlKlhp0;{DU6Sq`SSBLD7uE91233GqiScQwArtu z#cPe53)u9%^wtqTHx)__FLq+c%8x1(9F6lsiLY^tk3PDCI$Y9uO`h zCcu4OATA_gx+C2od}e*%UgR@Cz3<&N?|=ILPR>VWf0u#w1&GDi}VQ$rE|KNU6)2~^R{vtTEqTMG+%BbW!Xj^DdyMc8h~QitU(;JlP0Bw1=5*LE8|V5*dZC16sd?SY3NJnwYxRgtW2d(e$NKL zD{Q7;j>nsbK~ zEmCls$~`WV8f@HG_h{W zmJ|n^$kH;fbk6nUv<6*RvmK5b4Kixj8iwrE`QDgXRGsB19j5)6oeKB$HU~V~+KQ1(sY$Q$Xd!g^2vQ{q;u6A46STJ=1lB^Q z6l5;zXKXP-^(^$&C*4(*QkZ64Vluk0Ps+%2fuF4{c@eRwf)B~1Q4(T9FR|g=hWDLQ zZ6QpGnyDz98)k48nS0Sq1Jm+mLVjV&MTm?mVTO&w^l^Oqh@Wkho5f$NpG?}f!i2Hc z8zU${j)ltM2PV(lWssl&>B(uJlKW-wXCd%)_gBl|w_Aj;^n$2#sudRzaqNZ%&m%wL z0|3#StbW8zCvOyqqIL?w@i?|}ziL65;_dk?!$n9)cZYB>c%SzIT^7tx(L<%!GbkWL z1x#O>%y|6+~{m|MXPBcv|hCgmyq`xHRfvPDjgwr?x#Zf|a z6;3E}xnG3a=p8Ft?q3^BrEX4P1A}hKp%uUA2BvF^zhW|=Cb*tK5LaJiF@;80bg&KV5e*|RG*DAKk?`7Z4^%^_WHgr3=(gH= zx_~S68ZDU&;6z!1giDH;(*l-15l?R9r0FJUc; zdTSF!_>mlvq#!j$8RZBgusHaby&ncQEk zj7)tPBY+gfTS{1WMf{-IDloW=c(%f%Z7snOQQ4ly$)0D>thiVpG=uI9nRJ0Sr$cTc z|D@Ra`Vb-Y9KT?hdjJci|HljqPo02Tvc7}rX?jWU^kE&xJi?@zIU%dUc5ToMH|sJr zb;>Y!!47~%bsuUT&uqVRX8fjl;B)TW^T#T7&Jm=B^iyN*OZbiYokM~VvpDdEZXv+fCIjgkn(Sg{n$rb7KJUXd${eqK~b0DhMVI~UOmen|k**jC%)Vnnkov&&!7Z3LEnTW{e0VA~9^=b*GqiG?V& zRa#P(YwuXc#ET6aEZbSu7#zX?Tf&lWA=;mi*dK?TUx|sM>F3E|3xz{KmR1V@K2f{% zkTSf61uugqWr2l?�!hEA%9ga|-Y6GihnifL6$9AuPHExK8qAdljk>h^Lwn*^0xS z`_pbKak0iseo`=nyb(_0B_Z9z#yOiva`zj=rH_&-aXoFLkco@?*09v6E`zHr8~j?+ ze{g9(GJoAlMCc&h;BrUr@kSJu7hfe<$nN9$?NL)phKv=N^>q;CyFvI$NI_rueu)0b zG!AoeB-~MbN(n08V1seD(f@82V_;Rt0;3(N| zf9!dY9nLP30Om?5fc^0A^QE|d_Q9Wt;=lLAAF1N9SRwNsCKNGXcZ4o2RL3bvg{8|< z0ao&%QKlDJs>n%Xm!Ix_aBT9R2xIAl{qB4DJ!x9=itB#qNA1!@TNsWC;f`jx{}u8) zB_1ry9w_mrx&9}cE`;RIgaSDU%%&UPDcR~rWK}X#SRxW; z){BsQDljYQK0Q^6ginfly!Os7O>#3pzR@S9%^bAXGsQUU!UbKpYvl)lSJb4ZtftcI z197UOX5<=5wiXs_>_jyP@D&hu+2JcBG{Ir9H=W5R6&y(xw`q(skB53>n7Ci8%8E=!vv>J@kS=N9@8T`91PGf zxi(qE)xZm(`mf3KuOc?qjz-pwx+-qAMh@EVleA8GL=HGAUclZ+t}xiGxrqZ)?>e_( zKF1@gpU4`{F}kfSY}80Fztq~U8 zcYPp-9^YkA*=0z6_t`+8C6(dsL(wKcKEc#J>Ru_a)@5jNdM7xvbeAy|- zYP97u1a^w)+ai#hS(?_XF|wRXUDT}dNMVB6WjiTJW)f3#l$x4dj$BpFbM_75T`XG} z8kaBL0c0&q)W``xH=x;L6gu{MBlAfZ1(DKcLgXrq#!1G&MF)n+k0(67^#r*Lawo9* zz~jdr`FgjSmT)H`Mf^S;^9ruyIT|@LnP~sR>Q@|5aRp9_;_hL;q95-)~9pkD`B-B8ERT{Qn2j ze>VNQCw;$X{Z(3k_qYEs>i^!s{@M8NPUYR%{#69o{%HJfT<<^i{C&p0yP&^{9s9pH mq<=R2`=I+*+iP)vfcziRTR|EU>Rme=@RJI3h0~nxwf_gfK%MUZ literal 398839 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∈ziNnwjSsVI`^9HNwscfI}OFR!4MIV6Hvuv2?|1hg2YNMc{*NUE?K8= zHBvEam@t2OA`l?$(eIZHW36li)uS3DSqlz)K0Ak<0du6!@n-43u39ih@ZWR9K|f=d zrxMwDa&vtg=L>`u-BPlEz#d8~;F0MCRuy9988>D9=O2u$p8y+$nSdZTrj{8F9`piWAfuF~{oGn~yJIwzgv*vjYposzw3> zn2bYr0#-_xB};*VQeeAyr(u}4ccJ&@8ppYAiF4iB=b{N6PkeJ8-7>)>-n5Kphh_+wq8?PXG$Fejm7u&QP*zj7QHSGj2dEYt_mz4I=VhDb`GzB zl~MSIILVtP%6)QrlBHTn{OIRFo=SwK*K!>z2i&Ji=qJBmLPYl|L+zTVM(KoTv^IoA zKAcqvlkYZOkfBsjC)oJm5gwg*ZcfcyiB~uGi?jc=MwH6MnRMjKMaq0#(3Kl?D>tC4 zL2!8z2dP_vl*`R-ox{dmE=kFgn)P*R)h%HOIN3x|om(UPE-su6Eyz77;LGZfp)!RyTc7yPm0n=`>H0_TXNSq&X*0nbEKZUyWl`4-7J?lRxk93=G7N# z^N-svrlvgV+PU1)-!l!nUTvWhjaVapM)z!%FtSA+INPrEnXQ;H?kFzLB3KF6n#Q#y zLYiAs9ekL>X&#-Vn!`O7_@saLkLPQ7Jw8C@$KSiD+`3Ce?RkjbEj9A_5%;Kkyf(9S zGTT@(2uq>CtgLT-LGS8S2g<`V+73DU9VpY;xTs5;XBwSsy%SpeUdxbKg}Ziw(ef>^ zwm);VA4s~R);`B+O>Pu++glg1aqxZ5Fg!W5Skj0}nQGd(i5`jAIu18`5}sWjm6+t#dd@YLt-0fLf0yV&1Qz|$Muk*pX`rx6dpVDSLVJN_*tRguAc_Hq*t_tH#1zX6o025uT~I$kBdnHTZ|`Nf{R% zuNJ#hUU2&%@&Gm!j7IY`paE%J=-Gw-l&q$bC~1*1w!=QrI+!M?64t8c7~&x`l97`7 zC(lKsN+iBSRp8l*JO+XqfJWWS%Cbthh{~S6hFGpvNPO1m;Jy6OyJ@r*>km{_jc@Nh zehO8$>wHL%1)E8xmyW^RLuuUQ&(;Z2ody$wAv{rh(hK5k@4`m*qMUp%K5W#oCadpt z`xNwm+R)BL=lSkisnJ)5ixP)XV-^d_({H{$$qLb&2g8y{=J| za~za&wkESGOo2ImNB+SB$RTa3ALq8-s-u85qinNqUxd-XzqGkA3E^U{cbj#6wxL?3 z4)a6a5{^Z+n`%By712c>xey3LnVRq(2n9ozK~p1z&W z9$Nx=2dZBo=39MOKqEiO8gQ0=w8Fk8uiP!GELoIFtVKC6hFM(=dta60mwOP~PbVWX z{*E2mh54~?EE$MQl9b9Rn_`p@f_vn?){u8?2`1y9{BZB8DSSB@Xd!wAFU;25ml5*= z>viB(P~V{MS@F7!ci)i050T{%oZS0vLFc^-1-5m7PgG?;mOo$LBm=a~2ztzSW!Sja*oyxciAnRr+0ntRfUco{ZveZJBc;;77NNDx+gAtz6qASU=c zz|9A#?KxMzF+nu(et??@QhRY$9zQ`migU*tmXq7;s6^0*ma6x`b(ge<6nGXfT{W14f!ku2kcQd%5CWy%}n_4 z@6OIQk7#CKwKsq|W3%kSOKYRN@iT$%_!s)6r<>c(H>sXfO){^xlPnJ#usvrgo&GK2 z*fRVue#Hnk3G*pbp1Set0PLg2|1Nu(P%G_BWMiAN>MVuQ<>;#k`7l0K3o_?@c}?k~*zq4v`M(V! zqWK<138)0V^RlBO-dd2-`$oQYv6^tiz<@)nKDP{|VIU#pELDyA@X^bz05O~16Dre( z9oon(MExk%>#dfD3wZh)`f+&2rf|YWrt34Bx3)|26UC<&FZ_1m_mmG>}ka*m{ z0d(D{7xxKrau!P$ESG#l0?e!Hr;3103vj$}a`HA*u#`FUXw%!j%@#u0|G&l5W*wD^ zdvS1+)kGO=;x>Xic8}X;lvJd3w%AI~Q%?k65c%JZ0jNrEX5(YPo4)zYQ>D5I zasA!OT=U)uoRvT~*V8W28Y{J8H&s3MAof51fpQ)4xk%lsRW~>StPkE_BJ@ar6$Hi| zH6(s(KOFF2cBH-FPBQbd*%0ns;SfdKXp|a0JplwXYp3X3FJU*%{`^VPQuy!3y z9#_L8bHRbuNgL$;HD;w#xnfQ_M#B>e(4MU4K%iu?AFHs*VAlZ-vntSSTMlw7({1sy zW!K79KmXAoR+C_Z44A%-2-7-~Wa60IqbwWRKLo$xqYZ4@|4>io`&=9raviaI%UBAl z2OJ5X>&{M_@tFzC3mj>!n_g_%wmaB&VUJ2ll!aqY-Z9f%BA)jmXE{?yM#&FSl`eGi z+pjXuEWEVPju$_Q{wWnR7$Yg`@udcS<@TC6*PE~(z5_GY9k#Tqdc8_6+#NQBhp~!T z@bmM;7+pVla_Kr^D+9Nd@ra|c&!+lAyGIw_Vy>zNtg8woem5?`ICCqAd?B~PLnn55 z!l?wYeT=TOUpk%Dp^Qa?G5**#51}EwCMKsy|7*7X;HO~jC>{y7+t&F0wZJrk7LrHT z>-1|M@(g*bTY`Mdto{B-t~of_oOAZg^uu@-*Nh#7EW-BPZz2q#%Fjat@TKJeDH6Ht zJ~}*GmJ&^ z`W;a8+s~&u-%8k1#^Jzfq0d#{e^+f8+!p&LE&Y55qYFmUAA#&tlZa2;b&G?niVfKU zdbSBK0yY<2E8d-);?)@AebNs!W8b7sz3xGoH<9*|H5(b%fYJvFH9eK18K4%++|$@a z*igM(VoF zYc&Pdp06L1D!RS;i`RIm|z zclG?n+&ZHTa8vVL0XV8wJc(69_6^mqIg6Xw1dH6}L8e+O!TBmTU(KH&%SvW;KzbJL zd1njksI4YS=7)wSB zDxdX)OmPBt4>dmHjJfT_Zq|Y&hG;vKhFDXz{MS-5pYtP^=f- z{P0?bT85Zxnb!R|6r(W|2rnGn$I6?zV`w){pQK&qHg)9W+TNf>CM9S`>C|*SI?CP5+hv7&yJyXa9nF z3%AFIK7~;5x^u=}uCwYAwI0siZB%(4a<%kJ|1f9fqKG|gUE}^C6l1(RcnaTKX@e;< z0t$$wsKMsnxS7vP&ac8l@xilC3J|2=tFqm8a^4l=77O<63K{MR-uH8^JHK7DntZOL zusL=Xnj^6qMUXl5$`iu(;^>E+!4?7~p8EVI?YXT}hQ6`{e& zF?+t3@J*W#WPDcVF9U5ziBS%NwvAiyCM}rf@$(#twHP^Nr5&$*!~Ja`hpbYs3m+%W zzGrpk+urxpAMNGBf1(5t*>iQrP3wl(Ax^4ydXT-9JJV5xiz?kH?6$@+i1`GbvQI$z;8`${fD!>H6h5w@Ig>S_S-&V>o3QD8ntn+KWd8 zq=m7LkCo1Xhx;MplA}r)t2U(K>#*0c=;A>ck150Lv*FpNynxfZkLFXW3e`PKiCj6o zyd|wRD`x$`I(gS26(OyCg_2wMbNol7KtmJ{k!=Hpp06*wQNxACTDSuTQ2}6!F}GWk zb8bW`qHrud=n&xyuoVef9l$M&Q7>rj=Xl5)LlH}S)o(pcUS+RIA6pnBJV@tk9*8Cs zdrAu3N2Ml0R?)ukZt(fZ?WY+vVZpNrtat)r=z~#Zf*-f`zdr}aWGqq z6B=qSpxUo~6`{kM0zT(+^m@QdSU4(uNGGeQd3K9(Jyqebq6FMyzxZG4Wc2#50M42d!4YU z!?pH>6ARa7rNW`nHRi{2LTc1_5Ix^3M}oRd{mJ`GwACCq;JW;yGCYouYiB-JLREZ# zp(>}r?V`nsBIJgnM9l2rV-~9*R&AoV!FdTV&yEMbTtwAv%_C@#Hh!%09>eC_gPo$yZ zHTS^Fp`-VZvv`#NBSx*S38SmF25}te=FdZ(q?-#Fj%{i>VBormSjI$P=xU<5#9a$u zs12?gjb)4mQACIHMhqzUoeRDZF580r=7%f=x_07@KT7P^c4&m_KEtj#Pb!OBjPE%y z|2+1caj;Yyx#4tMPIJ{IkMpD7mgSL0rg*eCt}ISA)&ptuNs&(I<(nyGHk%5LBK#4d zDJd=37HNDRCLs>_CUST&O>pHnQIDr(rLai$R7Ovvw`M-d=ADu($&=04F@2pYes&FF ze#kK+_Ork|#;9LYI>)_7Bjd(KoW)H0)eE*;tA}L2Xv~F3N4PL%$kzO^u=F{5v#e6M zf=|PRO^6urRF1bDD&w&9Qa;D`rKGU&gB7j`Aep`TO5cE8|5id|j{GLOL>|z?WgDId z@Nhj|uYIF7;2(kIUfo;p`tv?ERXI^cJ)r7}F&6QaH}+IbkH7uytNE&E+q~VDDerCZ z{%qeHlESXe^sY+>dXNT#nLXIcTV40~JAgv%)rSc@uL$|Mq+3DEP{cD&K2yU7HqLZ) zh<+PsY78U3IiuF6^>YdpWq9+L|~Urn%p0972=D|E9BJx?zQlo#fB@ECR#=#;TYQa4)_ zFb0u719fJGN;aveK=YOCQ!>8)Wk?X3Uv;D-KhVx>$iJwNVJ2`HzdT<`j>(qmSwQDX8uxTP&QlFhe+J9mE4&wS(ZC92_H4B(9?P4A%Ca3X{H1v zcP0$(+jS6Pww?1mQR+o<$&Gzq3bpg)+jwp8*+x+-6YAn;g5bWfW+H*yNQUB!_7(eM zKVlW@oj-3DWVc;i89ba2B`hBxd<592Y0d-}J-Ddd>Y(R*D}9VD9e8!1B&*$I#(nA6 z*!D!)F-w6Sr*~f@=z${AaY*OcDBCkL5J$Q;EP=X0-PR8V%xF+HY>8KYP+GMb;`yrQ z^dcD_xv5yh-4{8fEqxSiCdTjjF7u2%3t0lFj8*LhBX^m0u+@07%@ny~j7+;YFE~`G zZbn2Ft&nY&$kaD+NQ+HdvL}w*fhNZ{kXeCRkRDrqU;(oEy@Vuph6o?+sMr#ryedN; zbRa*bZsGVBr-w-FCW9V4>%Pj|;ZL4!tbyF*(*gmFaurF%lcHsZb)&0JT@bwHYIuY0O#s+V z*v<_=B7kj2tAo4qt%b3p9e2hc#q+{FLS=O%*|P(IB+Fe^n{C@ANkED`V1`OHsR%*~ z>eg5;JTM!2QB-(n=7;!L9?yIeu<^$EK{QteH4~!ZE-fE^LiVgec*KwmJ>c03;YBVdZR_671N-8hg<=}gJ);AymC&HYR`9x2 zD`8mnP^ZDlpmsu3l6*kY5lexHB>4)MU~<;?znSu21@o?6JE6~aB73`uXS)fQdb_C= zwy+DBn$%>p`9gZ*1u!*CC_X`z9}Mb?qLo9obSK)|ugo z<2@G!Awm^DIQPDUsAKX0$H2Ld$yZ?4{c^+me8;l4>v^{8!FlRiq5J8tIGgc3E;`F- zE6I2T*eQ7mYFRZLNazb4%Rbt`)cVjYiS9WaSvT`S3Q@588SS(1(QR)@tFct!wT z?X*0elgo2|-Ep6LfUW8?xJLtLzRNvOJ$g;{j63|9={@QmA)_Ea$kA-^kN7BQxkm9q zKx9HiD`|8OAQD8{I(X^-vOu-7G#3b3puY=b&sf2jt;B%Tv4XkO zxzhu_eOqFr;829^U*8LChSOvFlav5IQr?MKk!yN$w zci^75>mBIVaT1`xXJPE|^Bh-(!P`{ug%~D!#xg`kvTEAA9^Dk|W#j9jZ04~s4a&vfVMc5pCl?Fw-GF&qpH(g8 zm2-)#{%t;QaK}HOPQ4qs!z&`nPWi5YdevL-sx`K5>Y-j^I(ngNapvMc-m31qAB;Y*B`ogyL_?JJ75%VzZpdNF# z8n@Hh4x{X;L~|~XeW&fbsa@i&RyVb(V*yH=ZMi-# zcGyNC_MIppeqU_qR|D^|O_}=&tBHN!HXN}MzYi!YUV02-*y5ktSB5GU9bZAjrO&04JUcYL;&kGj!szqm*qy=>)O;{; zPd=ZIhRbk~4iFS(3%IK2?parNz$!27bm!2giEz7PwM?lYPs^wq1B17hpuCXW@@$yWQ)?P)sl3WrJGK+$kyL72H+?9OAh1 zn7b}6Dk@5j;F%NTTy#a;6tjFO8hYo1u(5Ie2Zfrso)0Da-0;BqDlU?6_RcSXn-LL3 zD+C)jwubUX`DoH2uwchK(2emIM2&$3i)&@2jMZqvZ^@3Z5!Zlqc($J&#lp8fy{=MY zwyBAmQP6PCyt#Kr#w0a}MYCqpo$Ku4vfLz_)(t&r5MNIfkfc0J)l@;I3 zHI*hNVP-`+Rf5uhs-X*fccGPS?2g=Pv8JqVOn*x%bgSZ;auXYK166gSsanNl?Jj2F{ufOb?>z4A z-^Duz+zr%pEdMINcgc6a{h};IG%4%arXlNw;R)HjIP*CLoF?C=BLgKhh2%ih>HmTeW+8^Ize5jxFM%qa^3|k}^$TCjerryxoY@)s`IvGt zLMguM?Rl4-aq4l)7I=|Db@BB(k*|yWULUr6-zi>1^{`6!yWmu&(pb>qLo^RR<(gs@ z8)F5BSgAv@&$z7F#PTtKLsNWgsG7b_xu$T1bzYjaK*ui02*@)-;W;0hAeTqcyZ_TQ z4X^hU=yblGm8baOvncwtQ9U^H`SmQ-HUE_%;9k_3l3A~fA_a;R=fjDOE*#$TJb*J$ z@;yP1P|IBwp_3P8QX%3JlC|$N-k#E|o8eS4DzL2%S-u-h68mKAuVkszVrUo9KlOg) zU2w{&W5?TP!X_U)Q<{PWFCO^;3l3v;g^!>I)$c?`75ha2j(rvNwIm2P?!-RB{fRdfknY+mX{#OpyTuep|9Q*LsOfJ+1anrlix ztg6)&TCdbxkO8Q2j6sv7oM?2Dx4kY?ugEL(!C`9^F$)z+LRwJ_489Y|Q*v(=-D!0c zf!2`Ugo;{Mu+FL8N=OlDyA)MINwd~{<`v)yDeiT>2`o3SzCoAyJA8Fs3;`k>*xBGq z1CYgPt~&c1juG$cXqTSBcaAxy<{)JDEx3y z7Fcpn8u&<|+bRvFFw*8!7ca^>vLvSTv;>S!0(Zb+s}0#F!fnTtn$ z?K`Wr228pa49HI?u*L<8p?Qq!c>wvJc~}7}t=a~8 zjU&&M`kmtfGX5ObakizF=n}co({M*RxF~o%MSs^%t~9%*;F_n^4W^KFK(QeMj=LMw z^I6NM#E*d8czr;;V~%xA=6#*gUi$ctV0!9v9%pmTiC)kBcn$aQj)kEC;4@i$z-Q0y z^bURGvc4k534VzSoM8iK5JX_;IAuuX1cNYWQ)G#M@o5Hod+PrB5Y?stE^B5nc8W7J zH9%*iWy^_)Y1(IFz1H>u^-Dm{PtroDr*O2j_;io$GVwJ~S@+_c_U>nPgah-&b6NL` zg6zNNeb(`gEk4a3^ksQQW}u|Ep|HcEwa#c8{pgM7A&*CIaNMnbmS$aZ*B%_>iv~^0 zKYX06zo0nVT~rJ$Z)AZ2>%fI*`X}SmZ)5QeQFrS?`=3$1!}Vh24A;^bfN|vv5cy}# zg|ebt*0)7{p7(V?nJKw)ehaqx;m4@}$38Z^8dbej2Q6z8vpP z*I5pf@%wlmIj+vnqkWtWy|SNqlT+!*^5;SEY3%X`lTFSxC&6LJHiKUGY=+IzCj}g9 zjGz1(6rU8h$#YFPi;g)z0Xl*6n#8I4vD>}OsCR6kOl+Y*0NFx!){kuPwGCo#N7fbi z)g1tmp{}crp8;WIG{hHFD94pA2NpKl{mlIUYV>wwO~L$VBWV{4`a@6HQ-xa=kRN-V z&;>NaSE}|t{FFQThk2yx3OzsYeI}sM0ZV$S5P#ha7+SG3pW07m#ws>ln2S}kyoPCN zcG@2y;O1Xw6xAUDlZa2r4jMTwxayJasAJ6r%7A0*RFGAd?3IEupY^fOoyV*O{s+cG|WH7ML`a&d*LXMi;^5m7^ zXdKsf3!5!OXvD00f?`DI*yzyAr}>hz+rU|F?dfY&myZd#DSO!{MhMU%TQ@Th?kpak zEczi5LqTMIZ9FL-({YnaA3X!klBNH1e0M?{*J)OfsnvV@m`DSW^?Y)NwZz{L>+x;3 z{(|7Vm`49We^=BBRf(v*$+~pA_5VBF?1$(NCT8PX>As zgNtc<|J0W*N+emA>9@WVa3=k4eJNmly5IUzzyRo%e>ragU;y+>-@P9IFaY|c?>|gm zU6FmZ%tSm{m-}WW>u-g=GU@-M7kTvOjFo=srWexy*e{V3H~{;VLsU2b`=t{V&i$v& ztRJXSf2|upI#uc~t^ZL8AP@1cZZJiCOxET6J?Y2C>IOG6_x|apOKBn>^qGG9i2?>d zzjUI24gQQP1q^_G8O5njk@!0g_lf{uk>6ecB>!)x2l9}OD~4I*+r>2AKN%RJ?kDTA z|EaIP`nj8#%)j-efb|)E>q`ND{Bzw2#U;y+>Uv_-}eC|&d|HJe^9vU4M zKc@dNK>g954EsdBT}nIur@kyvKa+Kj{i!bq&fNE>z93ki<+r{RFd*@le<@%<;xBzE zU;y+>-+!3CI@8f072&fi@~BCFKp-7`nNr#=MXdt^>4j!#$HCGz@B!@=b>33XC{Onl zSlS$Qt!vbe6=Y@`3V#O6wQLrE4DHwN%{u%Ytk%Z*08-UaWX@pk3RtXbKK#dXgTFtA zeatq@+&k~dgg?5Hnme%iv4539RnsH(dFuAfdm4bx0Lsi?DNr%f0beabqw?w#uOxmw zhcM#=p8=Gi1?GhI&p4&Lmo(~3{>&?(M;(cV&EPYD;_P?*98qb5$+DzUz*Gv~)l7?K z3<`i})QSI9<6m!pneuOL{Qq&K_yUzJS+_nBL)pan{jF>mWd2jP0r#Cuv|99UW%{qw zX}RV^ISUM5{tP=oCag1@9uz{IbFU>%A7szD3Gzux#a zH~w8I|Mj}Dc_1GBSe*``3|^N+(f_S_8KePcuYWut9R|zgzXkHY)-E^^qy9>Z^@;9a zyV#0TT6{^PE`aUArz6q58GHs%$H1;tYlEq>q*ANkVYXOHGL+}|u0aFDk&H`QQ42=RNzLK~Gbgh5YpoZaJZ~U7Z|E`q(e%%1Ba9Dx! z&L-soe(&F^msu3`3h*Cp^(f`?-vasHY8M_lOPd+wf~T0|kKW7%_UOaX>090Hv#>Kd1k__>a{pZ%WH=$sZrXjF}`H-gn#s@NF*V zKKTu4d2XSn42MSn-#R>H;N4;S(yTVV>$x1@TY&uqjeUZ~K1pRCqp@$$*ss#q)oJXJ zH1;SO`&7r9bdT=6EKS=y2`?F>wPP)*&X7Y=oZP8v9oo`!_1P-#V2&f1S$iL1TYHW4}jZx23TU#!G1~XLIheBTCD2vWzBD zG6itPG|ieSnl;r_Yy1|e&KO&yI%B^#)t9HYslMEgrTUVKO!Xy-#{QYczCvSPp|W?< z*niO2FVfgmXzV?5R&f*8&K!NUW$P@mFI(CACDj?#J5*;B(yS?=TC;0`mKh6FXN(c4 z&e*?Ab;kZWD*I6~l^soE@1U`-(b(6h>=q;{`zsQa-I>PjO=F*cx5zY00GYA^4bXcq zwk-^=@C=2y@`9A9NU>fbg zL8a$uwETW5t+AVm-=NXiG`jo%^*P%f+WZHpv?D<4RRfE`_7kvl1LXXFEe<3=19i>+ zS_3uPV`#Jvjn1RdrZgHwqwQ%lmPS9K(F7XpPop^+sq#Z;v=EJsrO{9toz@Vnz|Aq( zv;Q;gvx`z(0>t<2<)#c#>G%IZNBjp}^dEH4f6x+@@~2IXYhO98&2SG~fO-Ex!~cU` z{5yTPFY(z$+K2fw*w}J8LlxQmDW6xgn0xZlQ$ELOYiLD=k@C4nYc=2PcT+xov?Thw z#U-C!XPkHie&}d15&+fxt#RL8)qhez&jdl69#G={6Ai%b`A;s;e1M}l0C2;9#RvZ< z4Zwc?PeG7rE}@0s|85lipK1VZG5#?P{!K(m`}@bG@P7)ze=8AH!HxrH=1JK|{>M@P znu(#>xQK89hFU%Tv%~y#v9G!=1HVpvGLWNgw3f6!1pK~m6bF<%6u3Md2=U#Vs0ssq zk2vsq$77X8)Q>Jp`0gwP62H6bOrJyYHWr&KiWxdqj2Juh|3Tnti0&I+5DU43Zj;MP z>ttK_`y-c%z7(F{_+i~ixw4ni4|tIdAOkcW!Y5vrc_o@qErg5IBjE1 zRw;)ec)XH?dWS||jLy7(4Y6W~Z-RUYo@Snjg(a;&rBiW58Lapl#!8NekrwYMsl{>P zrRo|;v*##>l~WZACg&89qgjr76hCtYvszhVT7ly#y`r>aw0}@G=F94^R(ZYcaIfGn zzVaJl%BwF2hlT-S3$b`YlP9`YFbK2Xd;#^yyWx?w!y%_%Gc0vDc#lu6j=D{i4)wZC z$_@-Z88R#LtX)yeGah=h%wt(D(fB%Sr2JSF@DmhCuwO&ez48zzjdBb*84raF-E)Ze z_J)9Qp29c}4LS`A8pmgE!S3weG=K^gz;B(wX((KDDdr#pT$4&*$p+{s&`7>BUP3Bu_qDKigcczN@eXd@kz zbB8kO)-Bs{Z)I z8|Z_fIa!P$KNv{v^=>!zw`NOk`Ui7|-DqBP9;*3@-~9A$6u+5IQ9!d)cDxjksSW!u zB|N$=IzH$z0>A-(I}iDkx5)}3YjIwWfp8phs!A*O!9PJ+s1FfdEuVJ*M_@_gElK00 z9aAl?o+HyMXjh8Ae&rJhQXUEe{EE=@BW&iyzt z$N6;yOoy@@Tnm_H_uCJaO6e4pmhzPWX14hb+14$Ypz#9*zXICR+cGm<^C!oivKpsV z?GN|C*W$X{C#A^Dy1``ZEUA zqkpl#I;3^W6HZC2Pq4DDrIT@s#2)+);pO!)SqvX$we(w+*i51QF(_mRupS1ij!MU& zhp+Nj$^fSV)T4n?dj)e5w6l{z^!hl-Mgmv zcTy;u47W5b-UY)+QT#hD?lg;UE~FGiH~=*t&DC*f!j#d_(WFw0-#V~pUzdE?I0O9KB|IiAGc4gRq{>M9xStctN#wp zaen#8$h{!Whli{eiduQhpE|M}&tr#OaGcfi^>tQ(tgcR;=Ebcxo{npnQPuIVE!x8X zEgQb)pCsc``Qnq+qVT@4pPbW-0tAU>l0k{g8~ zp5s=fj#ieGzyg(J?jvqz#+!Xx+4;BUz>wz+#XmRnJ@fzwY*5)@PsD}hGd**qXGh5X z?l$1sx@Tmfm(Z5|iWTII32!0MXy z)+oc(w$iv&gGoRN*O{JMi&1mb>;^IwGX<8?GJu}@h{aEf$km=7OnhQfs}AOsTT+Xg zsDX0yPdCxKU}$r;VDK)FL?GWwx7i*r2;O8Z#W+u5oH^iFbCl2kQ1u3X3SG47l7PXy zql!#xT!$!Y9N-i~4d*5}Cjv=^hUJ}tJ!df&iiEX_#pY#~UW@r(g?$BZT+5cEn3BPo%wsZqoZ&1t&H2J>SR?!WmK+R z&bJZDgnXL#vzR`ph*jr_b-kr!t-_|0cYDU3(WSR;*SFzk=R4?3SYqqUv_kFgd1m9| z4#%$wPKK^#UNCAbxu40GZDhSC)LSU$(lEOw{-hI~NBXM+a_gVh8ms?BGEvN}GY=Da zS04oQDbL4CSnW~g_ptkK{;68!$M4LmP3z&u@q5~^dwYBk@Ok_=p2hFk?bnw6>+94* z@B2lX!2A5wU|Jp|R-RpI&(cZn`_o#l@B4gj&UoINu>Skcy_xs72=kYXcgWxNGBC?* zx7emYKzKPI|G{2{^lzu0KkQ}n9ZjtNG?`)eeO>)+%652YhKx9tui9dxw-aR^bb!bEW9jc3f!*U6e=!}+MxO#wO5;W z#dZ5s7I#nvch%SM2)onDpS0X#3rXBO6yo6uk#1aZt;!S|J3vyw$b4#Y4hqX1h*=^egZUbho>IxtqFEsUb^^P)qH!<&?GlM@j#85DtsC9xN{#Z<#_< zQWJfUJ=QQ**1q`3%3f@6#Na44Gb?j_4J0IteZz@e_Sc_I?;gMb@#!JyhtX9#sL0or zwvp#R9pylqz2 zLzLqnwA zG{V&~QHRV@gK@ck81IaEyZtq1Vn2RcnEvw_x{;E~Cf%<5@9Yqn(F4&DqI1 zH6)#O=K;VqMOahQ?DjsMi+oN}q8+ql$I_ADP)rpK_pOy2Oa9(8y4r3kOz^rNSI5a4NRemmE>uXBGUBq>Q}3{0qba&ti@A4$*bu zaJj_sv@8T@*ir{N-Th)~UK&)c=CaL+ZpXFHe`R(ROyGYyh}(3T4EgDu=I$lJR7^io z(!MuW>N$!{2sYx_7}3R*wCMdAaD1g@+(rAd>Oo;`yy5AuLNh4}Fr@nM#HvR4Plbl| zccD3%8#DL zDLT&S+5T;7WzB#DXEY$1f)T*4-@D=4(yuyEFd1W! zIh}WPS@A>lYujqX5lJ8b;J~s+{R+r9ukavo&o31&ZnSr+Yjtbm*<)EX*yD_vOT!(N zc)_KM+Rw}2TvWJ!cmU{iE8Z+d-7RWU5BQ6%Sd%4UcAivXc0TI#zQoCvqY2jX_o7%5 zNJy8TMkO&tV|t^(XqaY7w)RuUeTUkdK0LWOI-OJ?kppI>%W8C{L092LiwyZuym~#U z8e0apG)?-2Q+RAwj0|MMCKo6%(HR;QI1`K)jV+mV%LHX>LJ;8p#@WnQx~h79x3`FU ze+j3E9d7x6xFSpDc+MM3s}P?!vzQ$h&?iVko~T_9Y_&}dYVP2eNgjlWoCiz=xQmaA z@Fk}~LY0->3=Dx2!9zEL5KkiB69VE} zL_9<_XRXo!ylM{uSoBj>X26^nQa|MI-@mUKi}cXvUQlO?bjPje(*F z1D}?u&|j8CQJm6c=eva>M{j*0Ih5xQTiVYE_xZO5y%s6Abl3`9b)d{mjXhTTV2^w; znAX^4{&Ue`JBj4G5FJPsI~P>i1Mff*vt&a3hL&HHnQzTOv&?VlaLO`Lm+I9)hw$;l z@Tef)#T}##Hsj@$jiym^N5-dx3WkS92#JIe3L{s(^~be;#i%$+4a1fcLaXBn3ylyI zS}JtN7}GXja3!ZenGI#d5lgPCo~)cK3)iwv&&Nwt&m4s=oYHKLyRESCC6^TDM=9{s z^I0)t#D;>n+sj=<&8^UdP)`%2LAgcP2%WtUf$LTt{4ALWcOO2^23|dBq~Rb8Ww*QK z%tiU@xFlKRTZQ+X#yip*?^!@{U!ED~6;g=laRTR}NQn_@4n15{O@liA?sts4jL8!izkZ%;qxRK?Li&A)z;WFvg>E`Y*W>3uFx+%(RaPxANMpHp74gLdUMtmrpxDVLm@R!~^kr`7?r?(6`2o^pjRp5B)#^%aYAa+29}TNDcU zlXS3AbfEw9SJ;{mKEZ^OCAS|B@{F2m;@Nak1nms5W}`LA%XXc9po#C=QxBBcun1K@OrpO3ljL(^r zi*Pv3ti>n&gb1av-rMf+ni^gPt3dQSVr~Ok#0)pNCfzID zFo93gWQjw+X@} zJxJCzv>+-l%44kMZ>!13KYB{!SK$pqw{{I-$P6C|^vPF5XuCKmHQE!k5B6><)+0L0cvoUb`$A9x!gA?<7d^Vm`9Ix-KL zoS!iaTf(NCTv^#ZyrB~-QT1+`XPzkpKjAr7KsHd;a)d)HKx0r2149UQ2!*&E?KAjW zeMpEGa_T zvFoG#^9p7}huwMLuw z5---7cFF0$TXi5M@=cWW@#@dxTd6onqem&a+PPP!ljhwy60z(_A7oJ7?SZP|SBVE4 zMdi|wa#+p{^GAOOnKwA&P==R6Tc02^Ou@MyhaXwWnhCy0eH`|>MO1l14`YT-gQhHz z8IUCvkND~1nCbQYjs+}lSj%%iJ4?7Lv51sMgNQsBrj%;dfUUI0BfQ*z30@v|P(z5k{L>?%sV2nQ*1Q|XTkdqEZrS!Y!8*v2 zzD>ro+P(Y=3Yu5hI?n(H&MhfF>gdkA4>)QI<2^M2AAWswxKc* z95%D*$1eb`GpWt5S11o6ZmEL?vC8go&frn35oar3f71w!gw}w?H)<4HPbg7Pgyb}= zogeO87E?55ly9%ytN!_z_}RGeMk>e5PRm9)i=biiaFIgT{}p+GTXAt1Z+AQ#Asp$- z&g7OW_j7(N1n812lc(p6V2p}wmS|8W_}tTOjNvSD9TsRiAtj1$69yYHG6Zw;_>}|W zY}+w2?rduoUyDb8->;U8qC%QU@8~jZ0!`m2g0yrGBUa4o!-3mZ!0x6wE(c{UXO+EJ zECz$AJSFcT5Cz2OcMGc`Fb+}PBQfZk6(xcoC4=b>WM3`jI8%670f%TvaJnF#Kq^}j}gXKB!Z%){jH`vbanHh)Q{(9kX zeCAMCymnJ=eG-DHB#7^D@eCOxC#Z$yF3xLv>@eOdy)Iu2*wk1)W49L_3#cx&?F|a` zEi;gU2IS9P0q%Z~6vU}6LP^*b5=IiRlM(4EFPEh*py^bc9fVbf2kZ-nf^a~#q43}2 zZam_=gz;<1kXD_85Zxj#%jZg#Llx&k?K_%mT43*6Ac?r+Q_h&CQ#&dLk% z-qu`8e{EEPY6Eh)XFw(%i^LqaV`<9t*WC0!!=1?=lp^6=^SnLW|KbXoL{3f`j4hUR zI)YOZu=sXL9F#GPD)M|XLnr^f)3gvb$>~jbs=@5em%f;40ROR;)cnq^O_wOwB6txq z;e}}sBY?*tdcb3|Z`@0_yH7i(D3w$+YtmbYy8o67V95;Gai#eoY10@cxL@o+3bqxd{Fp56LSnB=9pWsQMF>l9O@8wfn=Y9u+2R(3(~9L#!nr(G<(b|KVL zv-njbGHh51R~GCwq$PZ$rDr+O@%2hHh^YBHMVzcFRuItIhf~*@aqupWrhbpfy8vF* zdVv4l7AHeYxhTmOTiiEvlB_M|e;+4H6o0I@=4; zw4$qBVp>~%^b}!pl(P@szr>hoG|qLU{aD=cats)aChd=Pkjs}^Q6To;5_t6^-yhuL zAQqSgFs3H3IANM+&;;3*PFQh&X(>$ChDqh0Vnw-Qkqsq;hteo8zLGEc9F6MaJtf3k zUYIkhYq&S)vDmlm= z&CZioOnUJUaQ`CS-}-H{_B)e(87n29sde>uVr|W^{I@9r%giPXijd~k{UBJF12yy?A=#=)|#>s824)AV% zVK91k5PQtu`V0xGH6{d!YlGgT_0)+-d?|_vecq#w}h#T)i4Q^1P;P<{K`W``XVN6LsLk1GUP3h zjx^7HxmdQwTRE=Agzolv7A**Xd6#$-xY^|>#7M1d*j~u?X;=0=Uc^e$4;HRwK86e< zZgfTG88M-j9EhdFN&{M#iq5h0Ej-6b0B)i;tyN4MCvQAnzR?Z^I{U1+-N641hYE+% z{S3nHYI?U%rl)eG>7gU@biad2*%AexF zG_w&0uC1Mggv6o|6cIj~tzwm^gHob#FY=Vke!~F?T2poEgb&a2ilQn-+0uB1=M13} z0Gtg+t6+M-=g_7ed-$N0nn`#E^Eju;@kq!3~6>v0oy{gzCa&1{;AsWKfXjgQ`01ts{Z53&e_xC``^bTVIZs2zBC|2bb zTNdq8T!vsCwvpqS^y!TuFtnym<`kf&Yj4Y+2MLPShGx7+{AriYjO%%=*ih6jrB8?S zCOS&J!5Jrf?&BGR>*l&mrreLp?yZR;C!^>?nJ2s;xhma`P_jypov^Mbjd^r@6sy2P zHBXgkJLL0$AB4u;c;=L)&agT&)(=jf(^er#8!9nClXj zM6N)5bmWO?-62#Q0?30H?~%mMt#^QKLoTUWCo~z*d`~E$0m#h~IR^8B42HrbORkTp zA_GLqpshKRR+V|x8{E-Mob}P<1b_`oZLN}sz}21xWO(qzb|g&%}Wz>Lc#t!%h4XL4hId@>tlPlN4h z@h|(y#Fw+07LrO5Psw{;w#+Y5K2#2z$>5S1)W#`A>25o5bgLMfB?2)mNIT+Ra#_wR zx`u5}8`4{a1wah;nHtnt+sAHVcwEW#>mOJkV6|jN{%jasEPOzd0EyBuD zRct`X4FQK7lpOvQ*CKOG`>DsrFxCmRp9%H3#Y+O|raTO4_-j(XM4Cx(l}u3WaszD& z%WhM$46L6@O)Ew$r>eR`EBUzs3sDsW2%c~T#-@Q)iN9o+;+|_y$#4P|1~4`s=QY^n;{#b8}p zlFkW@kNa)*E3SJ;u4S0d&;W!>{?CW|NE#cQ0X?qD7->HpNWB=~;kGSRneGA;@nUR4 zpAuC@ykC8>$4lq;MXoe`;Rv@fS3JjWz?cqQk7+7xy%O|*7cX0|i7c`Mrsbj(4%UV| zOm}T)wAr6W+${}FA|fSC9Nb{_^lVuEBkc(|Z3PR*3hPdElC$5w=^>a(7D~muFM%My zcJ6#;`@!6%ARZbZJ$k}!W;m`cXnmvB)=`=)zb&cnLRJJLOAp_rhcY51C~HP-81l6z z5Z;l{rFd$AOt?{P4;&QS(0p<^5|Sc0wQHZgl{aLvY{>_sv4j#GGt4P<1;?p}g==Qd|hR34D1X zcS=>6o)SO8IYFN}w3;Y9iDV<*ymPQeks+HHMjgFx7Myw5)Y}PE9x;w%Mco$^%m9|w zn9Qfdsy$IIymct=UJD6WRRkiP)K9zF_2|2>QTS3tS)_z15SyM-LC;nkpJ(OQf`hM? zp6jiwpL>BZ)h6W;Rwo-=`@d&ehmnzCOj?+Zs6>m)IzyX%0YwYxw?15!$PJ;8x}`mp zD=TDY*SxskM80#%9i6DRRQp*D#<+Td_8Cr-JPda?RFwMG4RhQ`J6Ryy9FlX&crG07`m93@vz28+I%cXB zP}Nau42oI6GurBr0Y-BvUkYKimPyO7O`brNZl`tQ)!r%liGCf7KmvmW~ycauZb3KnjQ0K;<5EwYK_yYP##IzGN zEltJev$nwC+#J+cU{uG{6H0piKbu@-$U$t{KY7&9Js#$T6k-9K zi_oIIRrH)`x8lJ}srM%|UNT#FK7&A%PU8~PU?j+Ie0QfT7228awCrRsKN;Hs&uDtO zW{~zgFoG*Km6LxWqr_<(tic(`_Qj+>vc;Ct^{aJ8|Jqeo{_8lrrrYF*^i%%LC6Ia>Yi)U4b5<5;Knq;*H)So&vXV3( z`}wBnttd=l^8SlDfZH?J98CW=c-^|(QVpP-z&%9D+t0M#u#->a!8V;>=R)1m9OW&Q z-_@BGsnyTaDk&{^2OF@arz~l>`;#2PO%CgU$GTO>;$v;O6t7%t(F!v$Y?Z?py17Qk z2B`CZHwBB=o{7ZepRAL|4CXeU<6$f}caMZpt78&G%g|ti#!{QSPJ2isxDo6Wi>XB{0e?}gh#t|e$2Hoe$%^I% zYEUqIL&BQ@qK{g-mz;2OY8E6cY-TRO3e;1)kV}ZY8g$2|VnkHgh=skbYl?41aFd;~ zxaB$;r&?m!TC(wH>p~)K7!m8jBJaWvQbm6S)pUgAwY9bpn7vrRoHd%3d4>pt5~nKh z5I@G`zHrIBRGA;9IwK+nogj=EqI6=}RYMJX9^t(-T$VZnz6`fr6OA~}rzmImUXss> zK$jZJKD)s(r|OWStSQMDAU%{Q*8@ZS>;z$e=CqJFt=&M|JK=#@P&)BzIWVY2A)FN# zmsG4~{9O82p-TWUc<937f>GMxfg@mz0k`>{$5msEFl}B}3A9 zNwN)88aoz3*7gv72MK}Dq1>LFv)-5iLg$)Fz zP!SciCm51D$BTs68`~GJ7+3JSykZr|-aewYY@Etzq8#1DY@LfbeJg|-gonE^`q58e zvHgyvmFa2J48~ZIooqYXp=8jDRORqyHXsfFr(LZ{wsDqWplwIG&!`YK_siag@viuO zKiXo^PWmJ*E*0a^v-0SYk}z6z{1`H{2~FprXtGW=M|{Sj3>oU?Ov&BzURWh#aBYaQ z^tgnz5Sx~ps-x7-7I83R{bxf6lf9WP<}3A)Yn`ABdV zFr{<%58qULJqx(NWW6qVhJB?txxR5(uM#Gsa2i}{>~!h*H@E~8g(tHI?>2KiOWc~V zk}vNZGey4ZV=(ugJH#B8EcmNSqddWsV8Cg$N|drS zBK<+hLQ>HJjfD}24G&8P{@esZ}5r8cA zhhM(T0B&?oDu^lW%W02K!LS~C15lZc0i3{7Pv&RjMeQS=l-kX3E?dib?0^gBdex*` zdE7*P;yqg-*O|l3N1q0}>yWC;Dj8&?G?!jrINgjH!Pysxb-?0hw zZFy!bE)dY5=YQJpga5A$KW7hXlfQQQE_Bu$SGmzX_SAzUu3~J2L7by`sQb;PCr?D? zGkS1HgGw9r6U1PCJ(I5Z=Li+MUW2z2v-U5UTy)>3Ho4S0@Y|7E^NOSrNtgEZ)cXTV z38sZtm2STzJvhKc2frAfe3sruJ2wE~?l*w{B;$bpt(nt!2o*5$_H2O(YbXjwi7l^niCDs{RsAIJbt|PdQ87AIIc~Aad}=h} zHHj(83ELF-R@h?G+85xZDmlq|nw;vZIv0!0E}bR7yBfzD(!^V&XB(6ut(B`(#P$sh z;+D1AI8UjP&9Fhcq)9|PXRfN9{gX70>B33tj&I$-st^^jy3!4D6gn zwp;rhZmiIC$ucsPzGWk62Uk&miPG{88-u1^a`w-qAIxNUim$@;f9VbK*JqgOeSSEyS> zTKkrQgp?;YE^rK{4^vj1$cXp1L~9a8?)689Xg5To0eO=2eq$+usmo#(Iwgun@lpQvf7v#YR41oFzm+&$mnuq6U?o{bM7M;H%B73{N2Wmwj( zyE=k&bUPb5K=xb?mXiy%NOUbR!@JGP-$-kkXZi`sD5d6j#oSb#}Nz1T^(m46d?aHHs=7cA1HA4mK#3>k?DQ9bS~q zKf8~6`i0CEh+4Q`)m+8gY%JDWrnMr4Nu}Xijb*5-U{UF_w12K%1W_H^=}4{Z7iBx0fpfK+YpCiG;LI1j z(3u<4S^jI~%ThA;spJKr!&1-ano!-GC%*B+HCFL_5sgpUTJwpY>4U}@$Ks+<(=Xq- zIcK@8zO8$2eZsKvR(^I@NkbyspN_wD%^lM4fOHc^7a%EcT7}q&V|3Y`czBC{TH34w z2xFeb%aJliy5Z!&1C#VnR0SZ4ZUb^Q_T){qyRCyy9hCM~#3bU3TAExuzo}@^=a6D@ z%TQ&1+I22erctiZnd$_Z6DBWN{ zKrb@?iT4oy=DptvEh9TStKS-joJ1Mh0VbqSg;^fa&7jYswBeH9RZ~9Rs|0=DQH^#a zjI-F*dy?Ws3#|)lUbF4^SKe*6aB|qTgB&?1tuqqAs_d0lROEYlH!*M%gU71(S2f4R z(Lq))6*>uzW+aZLp_e}P+-OF)i`c?p;1Fd#1q~<7c?^;={E7%&1x+ge2^XJN%j{7c zOd$sdA09F3Xwm@J%Im;=cMo!(>z>hrSA=-Baddjh_`%GzY&E&f*~^ zJ;cJkoJsQx7{j5Dm9BKZ=%$cON{VV->C=$K(UlAR)i`qe!*O!ywu_L!Nv759p5E(? zFrp;6UZ9-a&pYZ#OGlQB6_NGV7*c{!P5T{zrN3!H~zx${1HIy)=yg=i2~+{YJH>)eifGXLWz{o)Y^eafF7N0sJ&&Q zSHC>Oy5hnNi||7;fHZPO*>ul-wjBzYZ;Oo>K2xJqUEC(NL#&-hfU7R9`mb(pu#5_vLAGg`SSFMf%+aCm4SnTdS)8*Kv69UiA&cy9n0c;`Ev@tHV~& zox~;Y+Xx}Legv6}9TSWO#T%KxX7~tQL0@H}AFoFD$6$bjDz+;iYWVmgRR3SepSFmd zt+R=(v%ac_y@`|V?;>qhnUwz+6|W#~#5d^dwp>KPnfHBrP?E`r8s~DK7a2V^mbV(E zw8$!m0v7bTT1I(T&zj3_a~g*sP&2k^nW;w$1#1I2d^IEDhHsDM(USYE>iR#E-%A?t zcV;r&BY)X8R!A{-jD1i}w44P_Aucp4Mi>`5G|`%XvILh&2JHQ)R_!;t^GMc4V9w$< zg15?w3iItPsR0`@j|u$RLzWb=YcXnI*Qh%wuy51F&&DQ04GOQgoe1CC-fz!m!z(E+BtERCDGZxC506E$K=?iM6_ zykhUsP)sQ?qX0toe3*Ql$u#j4sOac8`PqzD)L@9)7*`6bA1q$tslRWRc_mjWLiGE^ zluu|K_vz%N*-X!0S+@yqQe^+gIQ9oMD#`$ZpaG!)K|w(Qd6UMfLmF8Gfq(o4`BAP| zA3gK$;cm@n>}crrTMG8yU;a{G{uAX-Y3#qF$b4Xbp!^|+buu?GasD4s{uG3g{@a68 znEeywe-zdJ^RfOEzWvsb{wto%{{sA{s`Q@#e=ekd>*M|vpRNA__3(r1G0={}r>be>MJJsP~^Ze^%^o t3i?-o#Qz&1{j=epgYMsRfAP`qe<*K78E}Z-=rA9z%nvI3ocR0d{{Wcx>7W1r literal 59860 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 x)Tci`9Dw*vyA zH3J328J=DX(En26=Tem4i%|Y7%AcPN_>J@E{nw8O{0Z>qIpx0rhW)<-{64k(&#ZqQ zANxD2RoIWLe;y|LC&HiG<$fb{7XMe9=l;a_a}m#P3@bpNsf1-SUZT<=H&nWLx0OQd= z0lus8SCoIo{hp$vjsJ=Az1jX#jeo||o&xw!{0Z<~jlZJ&GmP{UWqR@nQ+@@N{#4?h zYucBU=9&GW`kg&kpcYfcb@|Huzh2_)n~VcB7tR ztpL_+{if${tlyogKe7J#E`Ex&z4CXg-*0AVF>pY`{cW2o3eYg%O@FlZ?e6~o6$}h! diff --git a/public/files/bulk-upload-sales-template-2023-24.xlsx b/public/files/bulk-upload-sales-template-2023-24.xlsx index 59fce8b6f75f86fa401a9f036639a7ca476977a8..de79ac6d69e12af51b2338c4302922f785382e27 100644 GIT binary patch literal 293917 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 E4=hVh)&Kwi literal 394662 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 From 45addee279cfeb915f9f27a4a43bef1cbc8e30a4 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Mon, 17 Apr 2023 12:07:30 +0100 Subject: [PATCH 14/27] CLDC-2054 Add request a merge page (#1519) * Move and rename some tests * Add a merge organisation link * Add merge page * Don't display a second nav bar for support * Fix spacing * fix spacing and typos --- app/helpers/navigation_items_helper.rb | 2 +- app/views/organisations/merge.html.erb | 48 +++++++++++++++++++ app/views/organisations/show.html.erb | 3 ++ config/initializers/feature_toggle.rb | 4 ++ config/routes.rb | 1 + spec/features/organisation_spec.rb | 27 +++++------ .../requests/organisations_controller_spec.rb | 35 ++++++++++++++ 7 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 app/views/organisations/merge.html.erb diff --git a/app/helpers/navigation_items_helper.rb b/app/helpers/navigation_items_helper.rb index 8db369d59..3def5547f 100644 --- a/app/helpers/navigation_items_helper.rb +++ b/app/helpers/navigation_items_helper.rb @@ -101,7 +101,7 @@ private end def subnav_details_path?(path) - path.include?("/organisations") && path.include?("/details") + path.include?("/organisations") && (path.include?("/details") || path.include?("/merge")) end def stock_owners_path?(path) diff --git a/app/views/organisations/merge.html.erb b/app/views/organisations/merge.html.erb new file mode 100644 index 000000000..7d72d08b7 --- /dev/null +++ b/app/views/organisations/merge.html.erb @@ -0,0 +1,48 @@ +<% content_for :before_content do %> + <% title = "Tell us if your organisation is merging" %> + <% content_for :title, title %> + + <%= govuk_back_link href: organisation_path %> +<% end %> +

Tell us if your organisation is merging

+ +
+
+

+ Use this service to tell us if your organisation is merging with one or more other organisations. You can also use it to tell us about past merges that have not yet been reported to CORE. +

+ +

Before you start

+

Regardless of the merge type, you’ll be asked for:

+
    +
  • the organisations merging in CORE
  • +
  • the merge type: for example one organisation absorbing the rest, or them all creating a new organisation
  • +
  • to confirm or update the telephone number
  • +
  • the merge date
  • +
  • if user email addresses will change with this merge
  • +
+ +

If email addresses are changing

+ <%= govuk_inset_text(text: "Update all user email addresses on CORE as soon as they change, so that everyone can still access their CORE account. ") %> +

+ Users must have access to their old email address, so they can confirm their new one. +

+ +

If merging into a new organisation

+

You'll also be asked for the new organisation’s:

+
    +
  • name
  • +
  • address
  • +
  • telephone number
  • +
  • housing provider type
  • +
  • Regulator of Social Housing registration number
  • +
  • held stock details
  • +
+ + <%= govuk_warning_text text: "You will not be able to submit your request without the above information. Do not start the form until you have obtained all of the information. " %> + <%= govuk_start_button( + text: "Start now", + href: "#", + ) %> +
+
diff --git a/app/views/organisations/show.html.erb b/app/views/organisations/show.html.erb index bbe9ae67a..4561e985b 100644 --- a/app/views/organisations/show.html.erb +++ b/app/views/organisations/show.html.erb @@ -35,6 +35,9 @@ <% end %> <% end %> + <% if FeatureToggle.merge_organisations_enabled? %> +

Is your organisation merging with another? <%= govuk_link_to "Let us know using this form", merge_organisation_path %>

+ <% end %>
diff --git a/config/initializers/feature_toggle.rb b/config/initializers/feature_toggle.rb index 125aa6770..9986af543 100644 --- a/config/initializers/feature_toggle.rb +++ b/config/initializers/feature_toggle.rb @@ -53,4 +53,8 @@ class FeatureToggle def self.collection_2023_2024_year_enabled? true end + + def self.merge_organisations_enabled? + !Rails.env.production? + end end diff --git a/config/routes.rb b/config/routes.rb index c01f38027..f6e00083b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -119,6 +119,7 @@ Rails.application.routes.draw do get "managing-agents/remove", to: "organisation_relationships#remove_managing_agent" post "managing-agents", to: "organisation_relationships#create_managing_agent" delete "managing-agents", to: "organisation_relationships#delete_managing_agent" + get "merge", to: "organisations#merge" end end diff --git a/spec/features/organisation_spec.rb b/spec/features/organisation_spec.rb index bc6aa243a..7e25fe933 100644 --- a/spec/features/organisation_spec.rb +++ b/spec/features/organisation_spec.rb @@ -40,7 +40,7 @@ RSpec.describe "User Features" do expect(page).to have_current_path("/organisations/#{org_id}/details") end - context "when the user is a coordinator and the organisation does not hold housing stock" do + context "and the organisation does not hold housing stock" do before do organisation.update(holds_own_stock: false) end @@ -51,7 +51,7 @@ RSpec.describe "User Features" do end end - context "when the user is a coordinator and the organisation holds housing stock" do + context "and the organisation holds housing stock" do before do organisation.update(holds_own_stock: true) end @@ -61,18 +61,6 @@ RSpec.describe "User Features" do expect(page).to have_link("Schemes", href: "/schemes") end end - - context "when the user is support and the organisation does not hold housing stock" do - before do - organisation.update!(holds_own_stock: false) - user.update!(role: "support") - end - - it "does not show schemes in the primary or secondary navigation bar on the organisations page" do - visit("/organisations") - expect(page).not_to have_link("Schemes", href: "/schemes", count: 2) - end - end end context "when users are part of organisation" do @@ -321,5 +309,16 @@ RSpec.describe "User Features" do end end end + + context "and the organisation does not hold housing stock" do + before do + organisation.update!(holds_own_stock: false) + end + + it "does not show schemes in the primary or secondary navigation bar on the organisations page" do + visit("/organisations") + expect(page).not_to have_link("Schemes", href: "/schemes", count: 2) + end + end end end diff --git a/spec/requests/organisations_controller_spec.rb b/spec/requests/organisations_controller_spec.rb index 15cfba390..459987fdc 100644 --- a/spec/requests/organisations_controller_spec.rb +++ b/spec/requests/organisations_controller_spec.rb @@ -227,6 +227,11 @@ RSpec.describe OrganisationsController, type: :request do expected_html = "data-qa=\"change-name\" href=\"/organisations/#{organisation.id}/edit\"" expect(response.body).to include(expected_html) end + + it "displays a link to merge organisations" do + expect(page).to have_content("Is your organisation merging with another?") + expect(page).to have_link("Let us know using this form", href: "/organisations/#{organisation.id}/merge") + end end context "with organisation that are not in scope for the user, i.e. that they do not belong to" do @@ -435,6 +440,36 @@ RSpec.describe OrganisationsController, type: :request do expect { request }.not_to change(Organisation, :count) end end + + describe "#merge" do + context "with an organisation that the user belongs to" do + before do + get "/organisations/#{organisation.id}/merge", headers:, params: {} + end + + it "shows the correct content" do + expect(page).to have_content("Tell us if your organisation is merging") + end + + it "has a correct back link" do + expect(page).to have_link("Back", href: "/organisations/#{organisation.id}") + end + + it "has a correct start no button" do + expect(page).to have_link("Start now", href: "#") + end + end + + context "with organisation that are not in scope for the user, i.e. that they do not belong to" do + before do + get "/organisations/#{unauthorised_organisation.id}/merge", headers:, params: {} + end + + it "returns not found 404 from org details route" do + expect(response).to have_http_status(:not_found) + end + end + end end context "with a data provider user" do From 5602e4e540be2fc2907f9f6c487bee6149d2938e Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 12:10:55 +0100 Subject: [PATCH 15/27] CLDC-2190 Fix typo (#1549) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2190 # Changes - Fix grammar/typo in error message --- config/locales/en.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 074a00147..994091689 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -190,11 +190,11 @@ en: reactivating_soon: "The scheme %{name} is not available until %{date}. Select another scheme or edit the tenancy start date" activating_soon: "%{name} is not available until %{date}. Enter a tenancy start date after %{date}" owning_organisation: - invalid: "Please select owning organisation or managing organisation that you belong to" + invalid: "Please select the owning organisation or managing organisation that you belong to" managing_organisation: - invalid: "Please select owning organisation or managing organisation that you belong to" + invalid: "Please select the owning organisation or managing organisation that you belong to" created_by: - invalid: "Please select owning organisation or managing organisation that you belong to" + invalid: "Please select the owning organisation or managing organisation that you belong to" lettype: general_needs_mismatch: Lettings type must be a general needs type because you selected general needs when uploading the file supported_housing_mismatch: Lettings type must be a supported housing type because you selected supported housing when uploading the file From c78f2ef5f97b79f3ad94f12ab6b0dab0ea65a28b Mon Sep 17 00:00:00 2001 From: Arthur Campbell <51094020+arfacamble@users.noreply.github.com> Date: Mon, 17 Apr 2023 13:08:31 +0100 Subject: [PATCH 16/27] CLDC-1945 numeric questions decimal letter entry (#1442) * rename variables in test file * write tests for new validations * validate that answers to numeric questions are given to the correct level of accuracy and in normal format with only digits * add error messages for new validations * add or alter step on numeric questions in sales, amend one test given step changes * copy change * remove validation that is specific to number format and fold that functionality into accuracy validation, rejig tests accordingly * fix various tests * remove reference to currency in validation message that concerns step only and doesn't check whether firled is currency related * alter copy to avoid redundant repetition in validaiton message * save changes made in rebase * changes after PO review two step values had been missed in previous work in various places there were custom validations applied that duplicated the functionality of the generic min max validation that is applied to all numeric questions, in these situations sometimes the min and max on the question class was inconsistent with the limit that triggered validations these have been corrected and made consistent various tests were affected by this and have been amended accordingly * remove tests introduced by mistake in rebase --- app/models/form/lettings/questions/beds.rb | 4 +- app/models/form/lettings/questions/offered.rb | 2 +- .../lettings/questions/offered_social_let.rb | 2 +- app/models/form/sales/questions/age1.rb | 1 + app/models/form/sales/questions/age2.rb | 1 + .../form/sales/questions/deposit_amount.rb | 3 +- .../form/sales/questions/deposit_discount.rb | 1 + app/models/form/sales/questions/discount.rb | 1 + app/models/form/sales/questions/equity.rb | 1 + app/models/form/sales/questions/grant.rb | 1 + .../form/sales/questions/leasehold_charges.rb | 1 + .../form/sales/questions/monthly_rent.rb | 1 + .../form/sales/questions/mortgage_amount.rb | 1 + .../form/sales/questions/mortgage_length.rb | 1 + .../questions/number_of_others_in_property.rb | 1 + app/models/form/sales/questions/person_age.rb | 1 + .../form/sales/questions/previous_bedrooms.rb | 1 + .../questions/property_number_of_bedrooms.rb | 1 + .../form/sales/questions/purchase_price.rb | 1 + app/models/form/sales/questions/savings.rb | 4 +- .../form/sales/questions/staircase_bought.rb | 1 + .../form/sales/questions/staircase_owned.rb | 1 + app/models/form/sales/questions/value.rb | 1 + .../validations/property_validations.rb | 26 --- .../sales/sale_information_validations.rb | 2 +- app/models/validations/shared_validations.rb | 21 +++ .../imports/lettings_logs_import_service.rb | 4 +- config/forms/2021_2022.json | 8 +- config/forms/2022_2023.json | 8 +- config/locales/en.yml | 9 +- spec/fixtures/forms/2021_2022.json | 26 +-- .../questions/offered_social_let_spec.rb | 8 +- .../form/sales/questions/savings_spec.rb | 4 +- spec/models/lettings_log_spec.rb | 8 +- spec/models/sales_log_spec.rb | 4 +- .../validations/property_validations_spec.rb | 49 ------ .../validations/shared_validations_spec.rb | 158 ++++++++++++------ .../requests/lettings_logs_controller_spec.rb | 2 +- .../lettings_logs_import_service_spec.rb | 4 +- 39 files changed, 200 insertions(+), 174 deletions(-) diff --git a/app/models/form/lettings/questions/beds.rb b/app/models/form/lettings/questions/beds.rb index 75d2a835d..6fa6c7c2b 100644 --- a/app/models/form/lettings/questions/beds.rb +++ b/app/models/form/lettings/questions/beds.rb @@ -7,8 +7,8 @@ class Form::Lettings::Questions::Beds < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 150 - @min = 0 + @max = 12 + @min = 1 @hint_text = "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom." @step = 1 @question_number = 22 diff --git a/app/models/form/lettings/questions/offered.rb b/app/models/form/lettings/questions/offered.rb index e41def301..2c9828d31 100644 --- a/app/models/form/lettings/questions/offered.rb +++ b/app/models/form/lettings/questions/offered.rb @@ -7,7 +7,7 @@ class Form::Lettings::Questions::Offered < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 150 + @max = 20 @min = 0 @hint_text = I18n.t("hints.offered") @step = 1 diff --git a/app/models/form/lettings/questions/offered_social_let.rb b/app/models/form/lettings/questions/offered_social_let.rb index d3ac29516..dd57acbfe 100644 --- a/app/models/form/lettings/questions/offered_social_let.rb +++ b/app/models/form/lettings/questions/offered_social_let.rb @@ -7,7 +7,7 @@ class Form::Lettings::Questions::OfferedSocialLet < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 150 + @max = 20 @min = 0 @hint_text = I18n.t("hints.offered") @step = 1 diff --git a/app/models/form/sales/questions/age1.rb b/app/models/form/sales/questions/age1.rb index d32083b53..0ae3bf682 100644 --- a/app/models/form/sales/questions/age1.rb +++ b/app/models/form/sales/questions/age1.rb @@ -19,6 +19,7 @@ class Form::Sales::Questions::Age1 < ::Form::Question @check_answers_card_number = 1 @min = 16 @max = 110 + @step = 1 @question_number = 20 end end diff --git a/app/models/form/sales/questions/age2.rb b/app/models/form/sales/questions/age2.rb index c0dc567a1..c003eb02e 100644 --- a/app/models/form/sales/questions/age2.rb +++ b/app/models/form/sales/questions/age2.rb @@ -13,6 +13,7 @@ class Form::Sales::Questions::Age2 < ::Form::Question @check_answers_card_number = 2 @max = 110 @min = 0 + @step = 1 @question_number = 28 end end diff --git a/app/models/form/sales/questions/deposit_amount.rb b/app/models/form/sales/questions/deposit_amount.rb index fb6c0e563..784bb56a1 100644 --- a/app/models/form/sales/questions/deposit_amount.rb +++ b/app/models/form/sales/questions/deposit_amount.rb @@ -6,8 +6,9 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question @header = "How much cash deposit was paid on the property?" @type = "numeric" @min = 0 - @width = 5 @max = 999_999 + @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 diff --git a/app/models/form/sales/questions/deposit_discount.rb b/app/models/form/sales/questions/deposit_discount.rb index 577da5a91..ae6521392 100644 --- a/app/models/form/sales/questions/deposit_discount.rb +++ b/app/models/form/sales/questions/deposit_discount.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::DepositDiscount < ::Form::Question @type = "numeric" @min = 0 @max = 999_999 + @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the total cash discount given on the property being purchased through the Social HomeBuy scheme" diff --git a/app/models/form/sales/questions/discount.rb b/app/models/form/sales/questions/discount.rb index 8c5cf7132..ee39b8916 100644 --- a/app/models/form/sales/questions/discount.rb +++ b/app/models/form/sales/questions/discount.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::Discount < ::Form::Question @type = "numeric" @min = 0 @max = 100 + @step = 1 @width = 5 @suffix = "%" @hint_text = "For Right to Buy (RTB), Preserved Right to Buy (PRTB), and Voluntary Right to Buy (VRTB)

diff --git a/app/models/form/sales/questions/equity.rb b/app/models/form/sales/questions/equity.rb index 0119fea69..4db09a31f 100644 --- a/app/models/form/sales/questions/equity.rb +++ b/app/models/form/sales/questions/equity.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::Equity < ::Form::Question @type = "numeric" @min = 0 @max = 100 + @step = 1 @width = 5 @suffix = "%" @hint_text = "Enter the amount of initial equity held by the purchaser (for example, 25% or 50%)" diff --git a/app/models/form/sales/questions/grant.rb b/app/models/form/sales/questions/grant.rb index 9b0fd3091..e113be536 100644 --- a/app/models/form/sales/questions/grant.rb +++ b/app/models/form/sales/questions/grant.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::Grant < ::Form::Question @type = "numeric" @min = 0 @max = 999_999 + @step = 1 @width = 5 @prefix = "£" @hint_text = "For all schemes except Right to Buy (RTB), Preserved Right to Buy (PRTB), Voluntary Right to Buy (VRTB) and Rent to Buy" diff --git a/app/models/form/sales/questions/leasehold_charges.rb b/app/models/form/sales/questions/leasehold_charges.rb index 22ed7246e..2b2afb3e4 100644 --- a/app/models/form/sales/questions/leasehold_charges.rb +++ b/app/models/form/sales/questions/leasehold_charges.rb @@ -6,6 +6,7 @@ class Form::Sales::Questions::LeaseholdCharges < ::Form::Question @header = "Enter the total monthly charge" @type = "numeric" @min = 1 + @step = 0.01 @width = 5 @prefix = "£" @ownershipsch = ownershipsch diff --git a/app/models/form/sales/questions/monthly_rent.rb b/app/models/form/sales/questions/monthly_rent.rb index 2a28bc691..75c4a7ce5 100644 --- a/app/models/form/sales/questions/monthly_rent.rb +++ b/app/models/form/sales/questions/monthly_rent.rb @@ -6,6 +6,7 @@ class Form::Sales::Questions::MonthlyRent < ::Form::Question @header = "What is the basic monthly rent?" @type = "numeric" @min = 0 + @step = 0.01 @width = 5 @prefix = "£" @hint_text = "Amount paid before any charges" diff --git a/app/models/form/sales/questions/mortgage_amount.rb b/app/models/form/sales/questions/mortgage_amount.rb index 9b199b2aa..ce4b548e1 100644 --- a/app/models/form/sales/questions/mortgage_amount.rb +++ b/app/models/form/sales/questions/mortgage_amount.rb @@ -6,6 +6,7 @@ class Form::Sales::Questions::MortgageAmount < ::Form::Question @header = "What is the mortgage amount?" @type = "numeric" @min = 1 + @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the amount of mortgage agreed with the mortgage lender. Exclude any deposits or cash payments. Numeric in pounds. Rounded to the nearest pound." diff --git a/app/models/form/sales/questions/mortgage_length.rb b/app/models/form/sales/questions/mortgage_length.rb index adaa94d01..218ea03a1 100644 --- a/app/models/form/sales/questions/mortgage_length.rb +++ b/app/models/form/sales/questions/mortgage_length.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::MortgageLength < ::Form::Question @type = "numeric" @min = 0 @max = 60 + @step = 1 @width = 5 @suffix = " years" @hint_text = "You should round up to the nearest year. Value should not exceed 60 years." diff --git a/app/models/form/sales/questions/number_of_others_in_property.rb b/app/models/form/sales/questions/number_of_others_in_property.rb index 556ddf837..450b12eb0 100644 --- a/app/models/form/sales/questions/number_of_others_in_property.rb +++ b/app/models/form/sales/questions/number_of_others_in_property.rb @@ -9,6 +9,7 @@ class Form::Sales::Questions::NumberOfOthersInProperty < ::Form::Question @width = 2 @min = 0 @max = 15 + @step = 1 @question_number = 35 end diff --git a/app/models/form/sales/questions/person_age.rb b/app/models/form/sales/questions/person_age.rb index 779e09669..cdbc9f80b 100644 --- a/app/models/form/sales/questions/person_age.rb +++ b/app/models/form/sales/questions/person_age.rb @@ -12,6 +12,7 @@ class Form::Sales::Questions::PersonAge < ::Form::Question @check_answers_card_number = person_index @min = 0 @max = 110 + @step = 1 @question_number = 29 + (4 * person_index) end end diff --git a/app/models/form/sales/questions/previous_bedrooms.rb b/app/models/form/sales/questions/previous_bedrooms.rb index d9f9aaddb..8f36a8485 100644 --- a/app/models/form/sales/questions/previous_bedrooms.rb +++ b/app/models/form/sales/questions/previous_bedrooms.rb @@ -8,6 +8,7 @@ class Form::Sales::Questions::PreviousBedrooms < ::Form::Question @width = 5 @min = 1 @max = 6 + @step = 1 @hint_text = "For bedsits enter 1" @question_number = 85 end diff --git a/app/models/form/sales/questions/property_number_of_bedrooms.rb b/app/models/form/sales/questions/property_number_of_bedrooms.rb index 9dbdbf3e8..b37253244 100644 --- a/app/models/form/sales/questions/property_number_of_bedrooms.rb +++ b/app/models/form/sales/questions/property_number_of_bedrooms.rb @@ -9,6 +9,7 @@ class Form::Sales::Questions::PropertyNumberOfBedrooms < ::Form::Question @width = 10 @min = 1 @max = 9 + @step = 1 @question_number = 11 end end diff --git a/app/models/form/sales/questions/purchase_price.rb b/app/models/form/sales/questions/purchase_price.rb index c98a39ef3..f88938777 100644 --- a/app/models/form/sales/questions/purchase_price.rb +++ b/app/models/form/sales/questions/purchase_price.rb @@ -6,6 +6,7 @@ class Form::Sales::Questions::PurchasePrice < ::Form::Question @header = "What is the full purchase price?" @type = "numeric" @min = 0 + @step = 0.01 @width = 5 @prefix = "£" @hint_text = "For all schemes, including Right to Acquire (RTA), Right to Buy (RTB), Voluntary Right to Buy (VRTB) or Preserved Right to Buy (PRTB) sales, enter the full price of the property without any discount" diff --git a/app/models/form/sales/questions/savings.rb b/app/models/form/sales/questions/savings.rb index 086a0ec8d..6c01ed2fd 100644 --- a/app/models/form/sales/questions/savings.rb +++ b/app/models/form/sales/questions/savings.rb @@ -2,12 +2,12 @@ class Form::Sales::Questions::Savings < ::Form::Question def initialize(id, hsh, page) super @id = "savings" - @check_answer_label = "Buyer’s total savings (to nearest £10) before any deposit paid" + @check_answer_label = "Buyer’s total savings before any deposit paid" @header = "Enter their total savings to the nearest £10" @type = "numeric" @width = 5 @prefix = "£" - @step = 1 + @step = 10 @min = 0 @question_number = 72 end diff --git a/app/models/form/sales/questions/staircase_bought.rb b/app/models/form/sales/questions/staircase_bought.rb index 9e54e92d3..dfdb273f5 100644 --- a/app/models/form/sales/questions/staircase_bought.rb +++ b/app/models/form/sales/questions/staircase_bought.rb @@ -8,6 +8,7 @@ class Form::Sales::Questions::StaircaseBought < ::Form::Question @width = 5 @min = 0 @max = 100 + @step = 1 @suffix = "%" @question_number = 77 end diff --git a/app/models/form/sales/questions/staircase_owned.rb b/app/models/form/sales/questions/staircase_owned.rb index b8d5a65ec..2b4d89861 100644 --- a/app/models/form/sales/questions/staircase_owned.rb +++ b/app/models/form/sales/questions/staircase_owned.rb @@ -8,6 +8,7 @@ class Form::Sales::Questions::StaircaseOwned < ::Form::Question @width = 5 @min = 0 @max = 100 + @step = 1 @suffix = "%" @question_number = 78 end diff --git a/app/models/form/sales/questions/value.rb b/app/models/form/sales/questions/value.rb index 4736f37af..d349a99df 100644 --- a/app/models/form/sales/questions/value.rb +++ b/app/models/form/sales/questions/value.rb @@ -6,6 +6,7 @@ class Form::Sales::Questions::Value < ::Form::Question @header = "What was the full purchase price?" @type = "numeric" @min = 0 + @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the full purchase price of the property before any discounts are applied. For shared ownership, enter the full purchase price paid for 100% equity (this is equal to the value of the share owned by the PRP plus the value bought by the purchaser)" diff --git a/app/models/validations/property_validations.rb b/app/models/validations/property_validations.rb index d2b6d2a0b..e9680facf 100644 --- a/app/models/validations/property_validations.rb +++ b/app/models/validations/property_validations.rb @@ -2,24 +2,6 @@ module Validations::PropertyValidations # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well - def validate_property_number_of_times_relet(record) - return unless record.offered - - # Since offered is an integer type ActiveRecord will automatically cast that for us - # but it's type casting is a little lax so "random" becomes 0. To make sure that doesn't pass - # validation and then get silently dropped we attempt strict type casting on the original value - # as part of our validation. - begin - Integer(record.offered_before_type_cast) - rescue ArgumentError - record.errors.add :offered, I18n.t("validations.property.offered.relet_number") - end - - if record.offered.negative? || record.offered > 20 - record.errors.add :offered, :over_20, message: I18n.t("validations.property.offered.relet_number") - end - end - REFERRAL_INVALID_TMP = [8, 10, 12, 13, 14, 15].freeze def validate_rsnvac(record) if !record.first_time_property_let_as_social_housing? && record.has_first_let_vacancy_reason? @@ -51,10 +33,6 @@ module Validations::PropertyValidations end def validate_shared_housing_rooms(record) - if record.beds.present? && record.beds <= 0 - record.errors.add :beds, I18n.t("validations.property.beds.non_positive") - end - unless record.unittype_gn.nil? if record.is_bedsit? && record.beds != 1 && record.beds.present? record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") @@ -70,10 +48,6 @@ module Validations::PropertyValidations record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared") end end - - if record.beds.present? && record.beds > 12 - record.errors.add :beds, :over_max, message: I18n.t("validations.property.beds.over_max") - end end def validate_uprn(record) diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index e4714e81a..f99d79cf6 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -12,7 +12,7 @@ module Validations::Sales::SaleInformationValidations end def validate_years_living_in_property_before_purchase(record) - return unless record.proplen && record.proplen.nonzero? + return unless record.proplen&.nonzero? case record.type when 18 diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index 57e1d05c6..0a0c3f63b 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -34,6 +34,27 @@ module Validations::SharedValidations end end + def validate_numeric_step(record) + record.form.numeric_questions.each do |question| + next unless question.step + next unless record[question.id] && question.page.routed_to?(record, nil) + + value = record.public_send("#{question.id}_before_type_cast") + field = question.check_answer_label || question.id + incorrect_accuracy = (value.to_d * 100) % (question.step * 100) != 0 + + if question.step < 1 && incorrect_accuracy + record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_hundredth", field:) + elsif incorrect_accuracy || value.to_d != value.to_i # if the user enters a value in exponent notation (eg '4e1') the to_i method does not convert this to the correct value + field = question.check_answer_label || question.id + case question.step + when 1 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.whole_number", field:) + when 10 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_ten", field:) + end + end + end + end + def validate_property_postcode(record) postcode = record.postcode_full if record.postcode_known? && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) diff --git a/app/services/imports/lettings_logs_import_service.rb b/app/services/imports/lettings_logs_import_service.rb index 01c71faef..56fb0c0d2 100644 --- a/app/services/imports/lettings_logs_import_service.rb +++ b/app/services/imports/lettings_logs_import_service.rb @@ -290,10 +290,10 @@ module Imports %i[prevten over_20_foster_care] => %w[prevten age1], %i[prevten non_temp_accommodation] => %w[prevten rsnvac], %i[joint not_joint_tenancy] => %w[joint], - %i[offered over_20] => %w[offered], + %i[offered outside_the_range] => %w[offered], %i[earnings over_hard_max] => %w[ecstat1], %i[tshortfall no_outstanding_charges] => %w[tshortfall hbrentshortfall], - %i[beds over_max] => %w[beds], + %i[beds outside_the_range] => %w[beds], %i[tcharge complete_1_of_3] => %w[brent scharge pscharge supcharg tcharge], %i[scharge under_min] => %w[brent scharge pscharge supcharg tcharge], %i[tshortfall must_be_positive] => %w[tshortfall tshortfall_known], diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index 741195f01..cf8ac4cd9 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -566,7 +566,7 @@ "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 150, + "max": 20, "step": 1, "width": 2 } @@ -588,7 +588,7 @@ "hint_text": "If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 150, + "max": 20, "step": 1, "width": 2 } @@ -702,8 +702,8 @@ "header": "How many bedrooms does the property have?", "hint_text": "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom.", "type": "numeric", - "min": 0, - "max": 150, + "min": 1, + "max": 12, "step": 1, "width": 2 } diff --git a/config/forms/2022_2023.json b/config/forms/2022_2023.json index e13ce5516..7c189849d 100644 --- a/config/forms/2022_2023.json +++ b/config/forms/2022_2023.json @@ -561,7 +561,7 @@ "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 150, + "max": 20, "step": 1, "width": 2 } @@ -583,7 +583,7 @@ "hint_text": "If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 150, + "max": 20, "step": 1, "width": 2 } @@ -697,8 +697,8 @@ "header": "How many bedrooms does the property have?", "hint_text": "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom.", "type": "numeric", - "min": 0, - "max": 150, + "min": 1, + "max": 12, "step": 1, "width": 2 } diff --git a/config/locales/en.yml b/config/locales/en.yml index 994091689..f224a6d63 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -144,6 +144,11 @@ en: numeric: within_range: "%{field} must be between %{min} and %{max}" above_min: "%{field} must be at least %{min}" + whole_number: "%{field} must be a whole number" + nearest_ten: "%{field} must be given to the nearest ten" + nearest_hundredth: "%{field} must be given to the nearest hundredth" + normal_format: "Enter a number" + date: invalid_date: "Enter a date in the correct format, for example 31 1 2022" outside_collection_window: Enter a date within the 22/23 collection year, which is between 1st April 2022 and 31st March 2023 @@ -213,8 +218,6 @@ en: ten_years_before_tenancy_start: "Enter a void date no more than 10 years before the tenancy start date" before_tenancy_start: "Enter a void date that is before the tenancy start date" after_mrcdate: "Void date must be before the major repairs date if provided" - offered: - relet_number: "Enter a number between 0 and 20 for the amount of times the property has been re-let" la: la_invalid_for_org: "%{org_name} does not operate in %{la_name}" postcode_invalid_for_org: "Enter a postcode in an area covered by %{org_name}" @@ -230,8 +233,6 @@ en: one_seven_bedroom_shared: "A shared house must have 1 to 7 bedrooms" one_three_bedroom_single_tenant_shared: "A shared house with fewer than two tenants must have 1 to 3 bedrooms" beds: - non_positive: "Number of bedrooms has to be greater than 0" - over_max: "Number of bedrooms cannot be more than 12" bedsits_have_max_one_bedroom: "Number of bedrooms must be 1 if the property is a bedsit" proptype: bedsits_have_max_one_bedroom: "Answer cannot be 'Bedsit' if the property has 2 or more bedrooms" diff --git a/spec/fixtures/forms/2021_2022.json b/spec/fixtures/forms/2021_2022.json index ec13bdabb..9ea11f671 100644 --- a/spec/fixtures/forms/2021_2022.json +++ b/spec/fixtures/forms/2021_2022.json @@ -905,7 +905,7 @@ "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "step": 1, + "step": 0.01, "width": 4, "fields-to-add": [ "brent", @@ -921,7 +921,7 @@ "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "step": 1, + "step": 0.01, "width": 4, "fields-to-add": [ "brent", @@ -937,7 +937,7 @@ "hint_text": "Not eligible for housing benefit or Universal Credit. For example, hot water excluding water rates.", "type": "numeric", "min": 0, - "step": 1, + "step": 0.01, "width": 4, "fields-to-add": [ "brent", @@ -954,7 +954,7 @@ "type": "numeric", "min": 0, "max": 300, - "step": 1, + "step": 0.01, "width": 4, "fields-to-add": [ "brent", @@ -970,7 +970,7 @@ "hint_text": "This is the total of rent and all charges", "type": "numeric_output", "min": 0, - "step": 1, + "step": 0.01, "width": 4, "readonly": true, "requires_js": true @@ -987,7 +987,7 @@ "hint_text": "", "type": "numeric", "min": 0, - "step": "1", + "step": 1, "width": 5, "prefix": "£", "suffix": " every week" @@ -997,11 +997,12 @@ "care_home_charge": { "questions": { "offered": { - "check_answer_label": "Basic Rent", - "header": "What is the basic rent?", - "hint_text": "Eligible for housing benefit or Universal Credit", + "check_answer_label": "Times previously offered since becoming available", + "header": "Since becoming available for re-let, how many times has the property been previously offered?", + "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, + "max": 20, "step": 1, "width": 4 } @@ -1015,11 +1016,12 @@ "care_home_charge_bi_weekly": { "questions": { "offered": { - "check_answer_label": "Basic Rent", - "header": "What is the basic rent?", - "hint_text": "Eligible for housing benefit or Universal Credit", + "check_answer_label": "Times previously offered since becoming available", + "header": "Since becoming available for re-let, how many times has the property been previously offered?", + "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, + "max": 20, "step": 1, "width": 4 } diff --git a/spec/models/form/lettings/questions/offered_social_let_spec.rb b/spec/models/form/lettings/questions/offered_social_let_spec.rb index 6516c661b..ac1930495 100644 --- a/spec/models/form/lettings/questions/offered_social_let_spec.rb +++ b/spec/models/form/lettings/questions/offered_social_let_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Form::Lettings::Questions::OfferedSocialLet, type: :model do let(:page) { instance_double(Form::Page) } it "has correct page" do - expect(question.page).to eq page + expect(question.page).to be page end it "has the correct id" do @@ -26,12 +26,12 @@ RSpec.describe Form::Lettings::Questions::OfferedSocialLet, type: :model do end it "has the correct minimum and maximum values" do - expect(question.min).to eq 0 - expect(question.max).to eq 150 + expect(question.min).to be 0 + expect(question.max).to be 20 end it "has the correct step" do - expect(question.step).to eq 1 + expect(question.step).to be 1 end it "is not marked as derived" do diff --git a/spec/models/form/sales/questions/savings_spec.rb b/spec/models/form/sales/questions/savings_spec.rb index 3f721d7ef..8e9c4daa4 100644 --- a/spec/models/form/sales/questions/savings_spec.rb +++ b/spec/models/form/sales/questions/savings_spec.rb @@ -20,7 +20,7 @@ RSpec.describe Form::Sales::Questions::Savings, type: :model do end it "has the correct check_answer_label" do - expect(question.check_answer_label).to eq("Buyer’s total savings (to nearest £10) before any deposit paid") + expect(question.check_answer_label).to eq("Buyer’s total savings before any deposit paid") end it "has the correct type" do @@ -40,7 +40,7 @@ RSpec.describe Form::Sales::Questions::Savings, type: :model do end it "has correct step" do - expect(question.step).to eq(1) + expect(question.step).to be 10 end it "has correct prefix" do diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 2d349f295..291af1622 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -111,10 +111,6 @@ RSpec.describe LettingsLog do expect(validator).to receive(:validate_shared_housing_rooms) end - it "validates number of times the property has been relet" do - expect(validator).to receive(:validate_property_number_of_times_relet) - end - it "validates tenancy type" do expect(validator).to receive(:validate_fixed_term_tenancy) expect(validator).to receive(:validate_other_tenancy_type) @@ -3022,11 +3018,11 @@ RSpec.describe LettingsLog do end context "when a non setup field is invalid" do - subject(:model) { described_class.new(beds: 404) } + subject(:model) { build(:lettings_log, :completed, offered: 234) } it "blanks it" do model.valid? - expect { model.blank_invalid_non_setup_fields! }.to change(model, :beds) + expect { model.blank_invalid_non_setup_fields! }.to change(model, :offered) end end end diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index e9acd4548..986130d3f 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -508,9 +508,9 @@ RSpec.describe SalesLog, type: :model do let(:completed_sales_log) { create(:sales_log, :completed) } it "returns small numbers correctly formatted as currency" do - completed_sales_log.update!(savings: 4) + completed_sales_log.update!(savings: 20) - expect(completed_sales_log.field_formatted_as_currency("savings")).to eq("£4.00") + expect(completed_sales_log.field_formatted_as_currency("savings")).to eq("£20.00") end it "returns quite large numbers correctly formatted as currency" do diff --git a/spec/models/validations/property_validations_spec.rb b/spec/models/validations/property_validations_spec.rb index 3b3e42e9e..e918e3405 100644 --- a/spec/models/validations/property_validations_spec.rb +++ b/spec/models/validations/property_validations_spec.rb @@ -6,39 +6,6 @@ RSpec.describe Validations::PropertyValidations do let(:property_validator_class) { Class.new { include Validations::PropertyValidations } } let(:record) { FactoryBot.create(:lettings_log) } - describe "#validate_property_number_of_times_relet" do - let(:expected_error) { I18n.t("validations.property.offered.relet_number") } - - it "does not add an error if the record offered is missing" do - record.offered = nil - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).to be_empty - end - - it "does not add an error if offered is valid (number between 0 and 20)" do - record.offered = 0 - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).to be_empty - record.offered = 10 - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).to be_empty - record.offered = 20 - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).to be_empty - end - - it "does add an error when offered is invalid" do - record.offered = "invalid" - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).not_to be_empty - expect(record.errors["offered"]).to include(match(expected_error)) - record.offered = 21 - property_validator.validate_property_number_of_times_relet(record) - expect(record.errors).not_to be_empty - expect(record.errors["offered"]).to include(match(expected_error)) - end - end - describe "#validate_shared_housing_rooms" do context "when number of bedrooms has not been answered" do it "does not add an error" do @@ -129,22 +96,6 @@ RSpec.describe Validations::PropertyValidations do expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared")) end end - - context "when a negative number of bedrooms is entered" do - it "adds an error" do - record.beds = -4 - property_validator.validate_shared_housing_rooms(record) - expect(record.errors["beds"]).to include(I18n.t("validations.property.beds.non_positive")) - end - end - - context "when a room number higher than 12 has been entered" do - it "adds an error" do - record.beds = 13 - property_validator.validate_shared_housing_rooms(record) - expect(record.errors["beds"]).to include(I18n.t("validations.property.beds.over_max")) - end - end end describe "#validate_unitletas" do diff --git a/spec/models/validations/shared_validations_spec.rb b/spec/models/validations/shared_validations_spec.rb index 8f5038c5d..fe3612c3c 100644 --- a/spec/models/validations/shared_validations_spec.rb +++ b/spec/models/validations/shared_validations_spec.rb @@ -4,8 +4,8 @@ RSpec.describe Validations::SharedValidations do subject(:shared_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::SharedValidations } } - let(:record) { FactoryBot.create(:lettings_log) } - let(:sales_record) { FactoryBot.create(:sales_log, :completed) } + let(:lettings_log) { FactoryBot.create(:lettings_log) } + let(:sales_log) { FactoryBot.create(:sales_log, :completed) } let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } describe "numeric min max validations" do @@ -15,102 +15,164 @@ RSpec.describe Validations::SharedValidations do context "when validating age" do it "validates that person 1's age is a number" do - record.age1 = "random" - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age1"]) + lettings_log.age1 = "random" + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are a number" do - record.age2 = "random" - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age2"]) + lettings_log.age2 = "random" + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is greater than 16" do - record.age1 = 15 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age1"]) + lettings_log.age1 = 15 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are greater than 1" do - record.age2 = 0 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age2"]) + lettings_log.age2 = 0 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is less than 121" do - record.age1 = 121 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age1"]) + lettings_log.age1 = 121 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are greater than 121" do - record.age2 = 123 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age2"]) + lettings_log.age2 = 123 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is between 16 and 120" do - record.age1 = 63 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age1"]).to be_empty + lettings_log.age1 = 63 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age1"]).to be_empty end it "validates that other household member ages are between 1 and 120" do - record.age6 = 45 - shared_validator.validate_numeric_min_max(record) - expect(record.errors["age6"]).to be_empty + lettings_log.age6 = 45 + shared_validator.validate_numeric_min_max(lettings_log) + expect(lettings_log.errors["age6"]).to be_empty end context "with sales log" do it "validates that person 2's age is between 0 and 110 for non joint purchase" do - sales_record.jointpur = 2 - sales_record.hholdcount = 1 - sales_record.details_known_2 = 1 - sales_record.age2 = 130 - shared_validator.validate_numeric_min_max(sales_record) - expect(sales_record.errors["age2"].first).to eq("Person 2’s age must be between 0 and 110") + sales_log.jointpur = 2 + sales_log.hholdcount = 1 + sales_log.details_known_2 = 1 + sales_log.age2 = 130 + shared_validator.validate_numeric_min_max(sales_log) + expect(sales_log.errors["age2"].first).to eq("Person 2’s age must be between 0 and 110") end it "validates that buyer 2's age is between 0 and 110 for joint purchase" do - sales_record.jointpur = 1 - sales_record.age2 = 130 - shared_validator.validate_numeric_min_max(sales_record) - expect(sales_record.errors["age2"].first).to eq("Buyer 2’s age must be between 0 and 110") + sales_log.jointpur = 1 + sales_log.age2 = 130 + shared_validator.validate_numeric_min_max(sales_log) + expect(sales_log.errors["age2"].first).to eq("Buyer 2’s age must be between 0 and 110") end end end it "adds the correct validation text when a question has a min but not a max" do - sales_record.savings = -10 - shared_validator.validate_numeric_min_max(sales_record) - expect(sales_record.errors["savings"]).to include(match I18n.t("validations.numeric.above_min", field: "Buyer’s total savings (to nearest £10) before any deposit paid", min: "£0")) + sales_log.savings = -10 + shared_validator.validate_numeric_min_max(sales_log) + expect(sales_log.errors["savings"]).to include(match I18n.t("validations.numeric.above_min", field: "Buyer’s total savings before any deposit paid", min: "£0")) end context "when validating percent" do it "validates that suffixes are added in the error message" do - sales_record.ownershipsch = 1 - sales_record.staircase = 1 - sales_record.stairbought = 150 - shared_validator.validate_numeric_min_max(sales_record) - expect(sales_record.errors["stairbought"]) + sales_log.ownershipsch = 1 + sales_log.staircase = 1 + sales_log.stairbought = 150 + shared_validator.validate_numeric_min_max(sales_log) + expect(sales_log.errors["stairbought"]) .to include(match I18n.t("validations.numeric.within_range", field: "Percentage bought in this staircasing transaction", min: "0%", max: "100%")) end end context "when validating price" do - it "validates that £ prefix and , is added in the error message" do - sales_record.income1 = -5 - shared_validator.validate_numeric_min_max(sales_record) - expect(sales_record.errors["income1"]) + it "validates that prefix £ and delimeter ',' is added in the error message" do + sales_log.income1 = -5 + shared_validator.validate_numeric_min_max(sales_log) + expect(sales_log.errors["income1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Buyer 1’s gross annual income", min: "£0", max: "£999,999")) end end end + + describe "validating level of accuracy or rounding for numeric questions" do + context "when validating a question with a step of 1" do + it "adds an error if input is a decimal" do + sales_log.income1 = 30_000.5 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income") + end + + it "adds an error if the user attempts to input a number in exponent format" do + sales_log.income1 = "3e5" + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income") + end + + it "does not add an error if input is an integer" do + sales_log.income1 = 30_000 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors).to be_empty + end + end + + context "when validating a question with a step of 10" do + it "adds an error if input is not a multiple of ten" do + sales_log.savings = 30_005 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings before any deposit paid") + end + + it "adds an error if the user attempts to input a number in exponent format" do + sales_log.savings = "3e5" + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings before any deposit paid") + end + + it "does not add an error if input is a multiple of ten" do + sales_log.savings = 30_000 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors).to be_empty + end + end + + context "when validating a question with a step of 0.01" do + it "adds an error if input has more than 2 decimal places" do + sales_log.mscharge = 30.7418 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors[:mscharge]).to include I18n.t("validations.numeric.nearest_hundredth", field: "Monthly leasehold charges") + end + + it "does not add an error if the user attempts to input a number in exponent format" do + sales_log.mscharge = "3e1" + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors).to be_empty + end + + it "does not add an error if input has 2 or fewer decimal places" do + sales_log.mscharge = 30.74 + shared_validator.validate_numeric_step(sales_log) + expect(sales_log.errors).to be_empty + end + end + end end diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb index d95e0a3fd..6de5c4db2 100644 --- a/spec/requests/lettings_logs_controller_spec.rb +++ b/spec/requests/lettings_logs_controller_spec.rb @@ -82,7 +82,7 @@ RSpec.describe LettingsLogsController, type: :request do it "validates lettings log parameters" do json_response = JSON.parse(response.body) expect(response).to have_http_status(:unprocessable_entity) - expect(json_response["errors"]).to match_array([["offered", [I18n.t("validations.property.offered.relet_number")]], ["age1", [I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)]]]) + expect(json_response["errors"]).to match_array([["offered", [I18n.t("validations.numeric.within_range", field: "Times previously offered since becoming available", min: 0, max: 20)]], ["age1", [I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)]]]) end end diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index ccc0e5d11..f144a798d 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -406,7 +406,7 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with(/Removing offered with error: Enter a number between 0 and 20 for the amount of times the property has been re-let/) + expect(logger).to receive(:warn).with(/Removing offered with error: Times previously offered since becoming available must be between 0 and 20/) expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end @@ -502,7 +502,7 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with(/Removing beds with error: Number of bedrooms cannot be more than 12/) + expect(logger).to receive(:warn).with(/Removing beds with error: Number of bedrooms must be between 1 and 12/) expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end From 9fb3bac3896fed08a5b2186ae7da2933c43d4011 Mon Sep 17 00:00:00 2001 From: Arthur Campbell <51094020+arfacamble@users.noreply.github.com> Date: Mon, 17 Apr 2023 13:08:50 +0100 Subject: [PATCH 17/27] CLDC-1852 add weekly rent period and reorder options (#1507) * add in a new option for the period question and reorder existing answer options * ensure that the lettings log calculates values correctly that relate to the period * ensure that depends on conditions related to period take account of the new option relatedly create methods on LettingsLog to allow improved readability in these depends on conditions refactor depends on conditions with these new method * update the 22_23 json form to use the new option as well * update tests to cover deriving variables that depend on period update test fixture to allow this * refactor some depends on and amend LEttingsLog method to improve readability * remove forgotten focus in spec file found in linting check * amend context descriptino in new tests * refactor a couple more depends on for readability --- .../form/lettings/pages/care_home_weekly.rb | 14 +- .../form/lettings/pages/outstanding_amount.rb | 2 +- .../form/lettings/pages/rent_4_weekly.rb | 6 +- .../form/lettings/pages/rent_bi_weekly.rb | 6 +- .../form/lettings/pages/rent_monthly.rb | 6 +- app/models/form/lettings/pages/rent_weekly.rb | 26 +-- app/models/form/lettings/questions/period.rb | 9 +- .../form/lettings/questions/tshortfall.rb | 1 + app/models/lettings_log.rb | 26 ++- .../validations/financial_validations.rb | 4 +- config/forms/2022_2023.json | 201 +++--------------- spec/fixtures/forms/2021_2022.json | 19 +- spec/models/lettings_log_spec.rb | 81 +++++++ 13 files changed, 159 insertions(+), 242 deletions(-) diff --git a/app/models/form/lettings/pages/care_home_weekly.rb b/app/models/form/lettings/pages/care_home_weekly.rb index ee8f7962e..56165ce62 100644 --- a/app/models/form/lettings/pages/care_home_weekly.rb +++ b/app/models/form/lettings/pages/care_home_weekly.rb @@ -3,18 +3,8 @@ class Form::Lettings::Pages::CareHomeWeekly < ::Form::Page super @id = "care_home_weekly" @depends_on = [ - { "period" => 1, "needstype" => 2, "household_charge" => 0 }, - { "period" => 1, "needstype" => 2, "household_charge" => nil }, - { "period" => 5, "needstype" => 2, "household_charge" => 0 }, - { "period" => 5, "needstype" => 2, "household_charge" => nil }, - { "period" => 6, "needstype" => 2, "household_charge" => 0 }, - { "period" => 6, "needstype" => 2, "household_charge" => nil }, - { "period" => 7, "needstype" => 2, "household_charge" => 0 }, - { "period" => 7, "needstype" => 2, "household_charge" => nil }, - { "period" => 8, "needstype" => 2, "household_charge" => 0 }, - { "period" => 8, "needstype" => 2, "household_charge" => nil }, - { "period" => 9, "needstype" => 2, "household_charge" => 0 }, - { "period" => 9, "needstype" => 2, "household_charge" => nil }, + { "rent_and_charges_paid_weekly?" => true, "is_supported_housing?" => true, "household_charge" => 0 }, + { "rent_and_charges_paid_weekly?" => true, "is_supported_housing?" => true, "household_charge" => nil }, ] end diff --git a/app/models/form/lettings/pages/outstanding_amount.rb b/app/models/form/lettings/pages/outstanding_amount.rb index d624433ea..22d06c2c8 100644 --- a/app/models/form/lettings/pages/outstanding_amount.rb +++ b/app/models/form/lettings/pages/outstanding_amount.rb @@ -2,7 +2,7 @@ class Form::Lettings::Pages::OutstandingAmount < ::Form::Page def initialize(id, hsh, subsection) super @id = "outstanding_amount" - @depends_on = [{ "hb" => 1, "hbrentshortfall" => 1 }, { "hb" => 6, "hbrentshortfall" => 1 }] + @depends_on = [{ "receives_housing_related_benefits?" => true, "has_housing_benefit_rent_shortfall?" => true }] end def questions diff --git a/app/models/form/lettings/pages/rent_4_weekly.rb b/app/models/form/lettings/pages/rent_4_weekly.rb index fd8518e8e..e71cd7ffa 100644 --- a/app/models/form/lettings/pages/rent_4_weekly.rb +++ b/app/models/form/lettings/pages/rent_4_weekly.rb @@ -4,10 +4,8 @@ class Form::Lettings::Pages::Rent4Weekly < ::Form::Page @id = "rent_4_weekly" @header = "Household rent and charges" @depends_on = [ - { "household_charge" => 0, "period" => 3, "is_carehome" => 0 }, - { "household_charge" => nil, "period" => 3, "is_carehome" => 0 }, - { "household_charge" => 0, "period" => 3, "is_carehome" => nil }, - { "household_charge" => nil, "period" => 3, "is_carehome" => nil }, + { "household_charge" => 0, "rent_and_charges_paid_every_4_weeks?" => true, "is_carehome?" => false }, + { "household_charge" => nil, "rent_and_charges_paid_every_4_weeks?" => true, "is_carehome?" => false }, ] end diff --git a/app/models/form/lettings/pages/rent_bi_weekly.rb b/app/models/form/lettings/pages/rent_bi_weekly.rb index 66ebef76b..0b1b9c884 100644 --- a/app/models/form/lettings/pages/rent_bi_weekly.rb +++ b/app/models/form/lettings/pages/rent_bi_weekly.rb @@ -4,10 +4,8 @@ class Form::Lettings::Pages::RentBiWeekly < ::Form::Page @id = "rent_bi_weekly" @header = "Household rent and charges" @depends_on = [ - { "household_charge" => 0, "period" => 2, "is_carehome" => 0 }, - { "household_charge" => nil, "period" => 2, "is_carehome" => 0 }, - { "household_charge" => 0, "period" => 2, "is_carehome" => nil }, - { "household_charge" => nil, "period" => 2, "is_carehome" => nil }, + { "household_charge" => nil, "rent_and_charges_paid_every_2_weeks?" => true, "is_carehome?" => false }, + { "household_charge" => 0, "rent_and_charges_paid_every_2_weeks?" => true, "is_carehome?" => false }, ] end diff --git a/app/models/form/lettings/pages/rent_monthly.rb b/app/models/form/lettings/pages/rent_monthly.rb index 04664bc93..d6af7a08c 100644 --- a/app/models/form/lettings/pages/rent_monthly.rb +++ b/app/models/form/lettings/pages/rent_monthly.rb @@ -4,10 +4,8 @@ class Form::Lettings::Pages::RentMonthly < ::Form::Page @id = "rent_monthly" @header = "Household rent and charges" @depends_on = [ - { "household_charge" => 0, "period" => 4, "is_carehome" => 0 }, - { "household_charge" => nil, "period" => 4, "is_carehome" => 0 }, - { "household_charge" => 0, "period" => 4, "is_carehome" => nil }, - { "household_charge" => nil, "period" => 4, "is_carehome" => nil }, + { "household_charge" => nil, "rent_and_charges_paid_monthly?" => true, "is_carehome?" => false }, + { "household_charge" => 0, "rent_and_charges_paid_monthly?" => true, "is_carehome?" => false }, ] end diff --git a/app/models/form/lettings/pages/rent_weekly.rb b/app/models/form/lettings/pages/rent_weekly.rb index ab89b31af..4f1709820 100644 --- a/app/models/form/lettings/pages/rent_weekly.rb +++ b/app/models/form/lettings/pages/rent_weekly.rb @@ -4,30 +4,8 @@ class Form::Lettings::Pages::RentWeekly < ::Form::Page @id = "rent_weekly" @header = "Household rent and charges" @depends_on = [ - { "period" => 1, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 1, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 5, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 5, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 6, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 6, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 7, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 7, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 8, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 8, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 9, "household_charge" => 0, "is_carehome" => 0 }, - { "period" => 9, "household_charge" => nil, "is_carehome" => 0 }, - { "period" => 1, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 1, "household_charge" => nil, "is_carehome" => nil }, - { "period" => 5, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 5, "household_charge" => nil, "is_carehome" => nil }, - { "period" => 6, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 6, "household_charge" => nil, "is_carehome" => nil }, - { "period" => 7, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 7, "household_charge" => nil, "is_carehome" => nil }, - { "period" => 8, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 8, "household_charge" => nil, "is_carehome" => nil }, - { "period" => 9, "household_charge" => 0, "is_carehome" => nil }, - { "period" => 9, "household_charge" => nil, "is_carehome" => nil }, + { "rent_and_charges_paid_weekly?" => true, "household_charge" => 0, "is_carehome?" => false }, + { "rent_and_charges_paid_weekly?" => true, "household_charge" => nil, "is_carehome?" => false }, ] end diff --git a/app/models/form/lettings/questions/period.rb b/app/models/form/lettings/questions/period.rb index 08a8510c4..c4f476c7f 100644 --- a/app/models/form/lettings/questions/period.rb +++ b/app/models/form/lettings/questions/period.rb @@ -15,11 +15,12 @@ class Form::Lettings::Questions::Period < ::Form::Question "2" => { "value" => "Every 2 weeks" }, "3" => { "value" => "Every 4 weeks" }, "4" => { "value" => "Every calendar month" }, - "5" => { "value" => "Weekly for 50 weeks" }, - "6" => { "value" => "Weekly for 49 weeks" }, - "7" => { "value" => "Weekly for 48 weeks" }, - "8" => { "value" => "Weekly for 47 weeks" }, "9" => { "value" => "Weekly for 46 weeks" }, + "8" => { "value" => "Weekly for 47 weeks" }, + "7" => { "value" => "Weekly for 48 weeks" }, + "6" => { "value" => "Weekly for 49 weeks" }, + "5" => { "value" => "Weekly for 50 weeks" }, "1" => { "value" => "Weekly for 52 weeks" }, + "10" => { "value" => "Weekly for 53 weeks" }, }.freeze end diff --git a/app/models/form/lettings/questions/tshortfall.rb b/app/models/form/lettings/questions/tshortfall.rb index af8d32c9c..69697ca44 100644 --- a/app/models/form/lettings/questions/tshortfall.rb +++ b/app/models/form/lettings/questions/tshortfall.rb @@ -20,6 +20,7 @@ class Form::Lettings::Questions::Tshortfall < ::Form::Question { "label" => " every week for 47 weeks", "depends_on" => { "period" => 8 } }, { "label" => " every week for 46 weeks", "depends_on" => { "period" => 9 } }, { "label" => " every week for 52 weeks", "depends_on" => { "period" => 1 } }, + { "label" => " every week for 53 weeks", "depends_on" => { "period" => 10 } }, ] @question_number = 100 end diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 0ddc921be..cd1fffd22 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -58,7 +58,7 @@ class LettingsLog < Log OPTIONAL_FIELDS = %w[first_time_property_let_as_social_housing tenancycode propcode chcharge].freeze RENT_TYPE_MAPPING_LABELS = { 1 => "Social Rent", 2 => "Affordable Rent", 3 => "Intermediate Rent" }.freeze HAS_BENEFITS_OPTIONS = [1, 6, 8, 7].freeze - NUM_OF_WEEKS_FROM_PERIOD = { 2 => 26, 3 => 13, 4 => 12, 5 => 50, 6 => 49, 7 => 48, 8 => 47, 9 => 46, 1 => 52 }.freeze + NUM_OF_WEEKS_FROM_PERIOD = { 2 => 26, 3 => 13, 4 => 12, 5 => 50, 6 => 49, 7 => 48, 8 => 47, 9 => 46, 1 => 52, 10 => 53 }.freeze SUFFIX_FROM_PERIOD = { 2 => "every 2 weeks", 3 => "every 4 weeks", 4 => "every month" }.freeze RETIREMENT_AGES = { "M" => 67, "F" => 60, "X" => 67 }.freeze @@ -203,7 +203,7 @@ class LettingsLog < Log needstype == 2 end - def has_hbrentshortfall? + def has_housing_benefit_rent_shortfall? # 1: Yes hbrentshortfall == 1 end @@ -496,7 +496,27 @@ class LettingsLog < Log end def care_home_charge_expected_not_provided? - is_carehome == 1 && chcharge.blank? + is_carehome? && chcharge.blank? + end + + def rent_and_charges_paid_weekly? + [1, 5, 6, 7, 8, 9, 10].include? period + end + + def rent_and_charges_paid_every_4_weeks? + period == 3 + end + + def rent_and_charges_paid_every_2_weeks? + period == 2 + end + + def rent_and_charges_paid_monthly? + period == 4 + end + + def is_carehome? + is_carehome == 1 end private diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index 82fdf56f3..d328054e9 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -4,7 +4,7 @@ module Validations::FinancialValidations # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well def validate_outstanding_rent_amount(record) - if !record.has_hbrentshortfall? && record.tshortfall.present? + if !record.has_housing_benefit_rent_shortfall? && record.tshortfall.present? record.errors.add :tshortfall, :no_outstanding_charges, message: I18n.t("validations.financial.tshortfall.outstanding_amount_not_required") end end @@ -69,7 +69,7 @@ module Validations::FinancialValidations end def validate_tshortfall(record) - if record.has_hbrentshortfall? && no_known_benefits?(record) + if record.has_housing_benefit_rent_shortfall? && no_known_benefits?(record) record.errors.add :tshortfall, I18n.t("validations.financial.hbrentshortfall.outstanding_no_benefits") end end diff --git a/config/forms/2022_2023.json b/config/forms/2022_2023.json index 7c189849d..181d8a19c 100644 --- a/config/forms/2022_2023.json +++ b/config/forms/2022_2023.json @@ -7492,23 +7492,26 @@ "4": { "value": "Every calendar month" }, - "5": { - "value": "Weekly for 50 weeks" + "9": { + "value": "Weekly for 46 weeks" }, - "6": { - "value": "Weekly for 49 weeks" + "8": { + "value": "Weekly for 47 weeks" }, "7": { "value": "Weekly for 48 weeks" }, - "8": { - "value": "Weekly for 47 weeks" + "6": { + "value": "Weekly for 49 weeks" }, - "9": { - "value": "Weekly for 46 weeks" + "5": { + "value": "Weekly for 50 weeks" }, "1": { "value": "Weekly for 52 weeks" + }, + "10": { + "value": "Weekly for 53 weeks" } } } @@ -7558,63 +7561,13 @@ }, "depends_on": [ { - "period": 1, - "needstype": 2, + "rent_and_charges_paid_weekly?": true, + "is_supported_housing?": true, "household_charge": 0 }, { - "period": 1, - "needstype": 2, - "household_charge": null - }, - { - "period": 5, - "needstype": 2, - "household_charge": 0 - }, - { - "period": 5, - "needstype": 2, - "household_charge": null - }, - { - "period": 6, - "needstype": 2, - "household_charge": 0 - }, - { - "period": 6, - "needstype": 2, - "household_charge": null - }, - { - "period": 7, - "needstype": 2, - "household_charge": 0 - }, - { - "period": 7, - "needstype": 2, - "household_charge": null - }, - { - "period": 8, - "needstype": 2, - "household_charge": 0 - }, - { - "period": 8, - "needstype": 2, - "household_charge": null - }, - { - "period": 9, - "needstype": 2, - "household_charge": 0 - }, - { - "period": 9, - "needstype": 2, + "rent_and_charges_paid_weekly?": true, + "is_supported_housing?": true, "household_charge": null } ] @@ -7898,124 +7851,14 @@ }, "depends_on": [ { - "period": 1, - "household_charge": 0, - "is_carehome": 0 - }, - { - "period": 1, - "household_charge": null, - "is_carehome": 0 - }, - { - "period": 5, - "household_charge": 0, - "is_carehome": 0 - }, - { - "period": 5, - "household_charge": null, - "is_carehome": 0 - }, - { - "period": 6, - "household_charge": 0, - "is_carehome": 0 - }, - { - "period": 6, - "household_charge": null, - "is_carehome": 0 - }, - { - "period": 7, - "household_charge": 0, - "is_carehome": 0 - }, - { - "period": 7, - "household_charge": null, - "is_carehome": 0 - }, - { - "period": 8, + "rent_and_charges_paid_weekly?": true, "household_charge": 0, - "is_carehome": 0 + "is_carehome?": false }, { - "period": 8, + "rent_and_charges_paid_weekly?": true, "household_charge": null, - "is_carehome": 0 - }, - { - "period": 9, - "household_charge": 0, - "is_carehome": 0 - }, - { - "period": 9, - "household_charge": null, - "is_carehome": 0 - }, - { - "period": 1, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 1, - "household_charge": null, - "is_carehome": null - }, - { - "period": 5, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 5, - "household_charge": null, - "is_carehome": null - }, - { - "period": 6, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 6, - "household_charge": null, - "is_carehome": null - }, - { - "period": 7, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 7, - "household_charge": null, - "is_carehome": null - }, - { - "period": 8, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 8, - "household_charge": null, - "is_carehome": null - }, - { - "period": 9, - "household_charge": 0, - "is_carehome": null - }, - { - "period": 9, - "household_charge": null, - "is_carehome": null + "is_carehome?": false } ] }, @@ -8602,6 +8445,12 @@ "depends_on": { "period": 1 } + }, + { + "label": " every week for 53 weeks", + "depends_on": { + "period": 10 + } } ] } diff --git a/spec/fixtures/forms/2021_2022.json b/spec/fixtures/forms/2021_2022.json index 9ea11f671..d25b575cc 100644 --- a/spec/fixtures/forms/2021_2022.json +++ b/spec/fixtures/forms/2021_2022.json @@ -879,23 +879,26 @@ "4": { "value": "Every calendar month" }, - "5": { - "value": "Weekly for 50 weeks" + "9": { + "value": "Weekly for 46 weeks" }, - "6": { - "value": "Weekly for 49 weeks" + "8": { + "value": "Weekly for 47 weeks" }, "7": { "value": "Weekly for 48 weeks" }, - "8": { - "value": "Weekly for 47 weeks" + "6": { + "value": "Weekly for 49 weeks" }, - "9": { - "value": "Weekly for 46 weeks" + "5": { + "value": "Weekly for 50 weeks" }, "1": { "value": "Weekly for 52 weeks" + }, + "10": { + "value": "Weekly for 53 weeks" } } }, diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 291af1622..6d45406b2 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -1079,6 +1079,87 @@ RSpec.describe LettingsLog do expect(record_from_db["wtcharge"]).to eq(187.2) end end + + context "when rent is paid weekly for 53 weeks" do + it "correctly derives and saves weekly rent" do + lettings_log.update!(brent: 130, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wrent from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wrent).to eq(132.5) + expect(record_from_db["wrent"]).to eq(132.5) + end + + it "correctly derives and saves weekly service charge" do + lettings_log.update!(scharge: 30, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wscharge from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wscharge).to eq(30.58) + expect(record_from_db["wscharge"]).to eq(30.58) + end + + it "correctly derives and saves weekly personal service charge" do + lettings_log.update!(pscharge: 30, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wpschrge from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wpschrge).to eq(30.58) + expect(record_from_db["wpschrge"]).to eq(30.58) + end + + it "correctly derives and saves weekly support charge" do + lettings_log.update!(supcharg: 30, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wsupchrg from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wsupchrg).to eq(30.58) + expect(record_from_db["wsupchrg"]).to eq(30.58) + end + + it "correctly derives and saves weekly total charge" do + lettings_log.update!(tcharge: 30, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wtcharge).to eq(30.58) + expect(record_from_db["wtcharge"]).to eq(30.58) + end + + context "when the tenant has an outstanding amount after benefits" do + context "when tenant is in receipt of housing benefit" do + it "correctly derives and saves weekly total shortfall" do + lettings_log.update!(hbrentshortfall: 1, tshortfall: 130, period: 10, hb: 1) + record_from_db = ActiveRecord::Base.connection.execute("select wtshortfall from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wtshortfall).to eq(132.5) + expect(record_from_db["wtshortfall"]).to eq(132.5) + end + end + + context "when tenant is in receipt of universal credit with housing element exc. housing benefit" do + it "correctly derives and saves weekly total shortfall" do + lettings_log.update!(hbrentshortfall: 1, tshortfall: 130, period: 10, hb: 6) + record_from_db = ActiveRecord::Base.connection.execute("select wtshortfall from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wtshortfall).to eq(132.5) + expect(record_from_db["wtshortfall"]).to eq(132.5) + end + end + + context "when tenant is in receipt of housing benefit and universal credit" do + it "correctly derives and saves weekly total shortfall" do + lettings_log.update!(hbrentshortfall: 1, tshortfall: 130, period: 10, hb: 8) + record_from_db = ActiveRecord::Base.connection.execute("select wtshortfall from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wtshortfall).to eq(132.5) + expect(record_from_db["wtshortfall"]).to eq(132.5) + end + end + end + + it "correctly derives floats" do + lettings_log.update!(supcharg: 30.12, pscharge: 25.13, scharge: 30.98, brent: 100.97, period: 10) + record_from_db = ActiveRecord::Base.connection.execute("select wtcharge, wsupchrg, wpschrge, wscharge, wrent from lettings_logs where id=#{lettings_log.id}").to_a[0] + expect(lettings_log.wsupchrg).to eq(30.7) + expect(lettings_log.wpschrge).to eq(25.61) + expect(lettings_log.wscharge).to eq(31.58) + expect(lettings_log.wrent).to eq(102.91) + expect(lettings_log.wtcharge).to eq(190.8) + expect(record_from_db["wsupchrg"]).to eq(30.7) + expect(record_from_db["wpschrge"]).to eq(25.61) + expect(record_from_db["wscharge"]).to eq(31.58) + expect(record_from_db["wrent"]).to eq(102.91) + expect(record_from_db["wtcharge"]).to eq(190.8) + end + end end context "when the owning organisation is a LA" do From e106928f751d09af93886f42b32d4cd330e76aa1 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Mon, 17 Apr 2023 13:17:35 +0100 Subject: [PATCH 18/27] CLDC-2192 Copy changes for bulk upload checking file page (#1550) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2192 # Changes - Copy changes for bulk upload checking file page --- .../bulk_upload_lettings_logs/forms/checking_file.html.erb | 6 +++--- .../bulk_upload_sales_logs/forms/checking_file.html.erb | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/views/bulk_upload_lettings_logs/forms/checking_file.html.erb b/app/views/bulk_upload_lettings_logs/forms/checking_file.html.erb index f38178b7e..7524072a5 100644 --- a/app/views/bulk_upload_lettings_logs/forms/checking_file.html.erb +++ b/app/views/bulk_upload_lettings_logs/forms/checking_file.html.erb @@ -10,14 +10,14 @@ Upload lettings logs in bulk (<%= @form.year_combo %>)

We’re checking the file

-

Once this is done, we’ll email you the outcome.

+

Once this is done, we’ll email you the outcome.

- We’re checking for any missing data, issues or errors. Depending on the file size, this could take a few minutes. + We’re checking for any missing data, issues or errors. Depending on file size, this could take a few minutes.

- If there are errors we will email you a link to view all the errors. + If there are errors, we will email you to let you know how to fix them.

diff --git a/app/views/bulk_upload_sales_logs/forms/checking_file.html.erb b/app/views/bulk_upload_sales_logs/forms/checking_file.html.erb index b729abc09..c47a97d5e 100644 --- a/app/views/bulk_upload_sales_logs/forms/checking_file.html.erb +++ b/app/views/bulk_upload_sales_logs/forms/checking_file.html.erb @@ -10,14 +10,14 @@ Upload sales logs in bulk (<%= @form.year_combo %>)

We’re checking the file

-

Once this is done, we’ll email you the outcome.

+

Once this is done, we’ll email you the outcome.

- We’re checking for any missing data, issues or errors. Depending on the file size, this could take a few minutes. + We’re checking for any missing data, issues or errors. Depending on file size, this could take a few minutes.

- If there are errors we will email you a link to view all the errors. + If there are errors, we will email you to let you know how to fix them.

From 0a78a168f3179c3c1ac7f71e3f8b8e3085088124 Mon Sep 17 00:00:00 2001 From: Jack <113976590+bibblobcode@users.noreply.github.com> Date: Mon, 17 Apr 2023 16:28:34 +0100 Subject: [PATCH 19/27] CLDC-2240 Fix collection logs end date bug (#1551) * Rename helper method not to conflict with Log method * Add older_than_previous_collection_year helper method * Fix spec --- app/helpers/collection_time_helper.rb | 8 +-- app/models/log.rb | 11 ++++ .../sales/sale_information_validations.rb | 2 +- spec/helpers/collection_time_helper_spec.rb | 4 +- spec/models/lettings_log_spec.rb | 51 +++++++++++++++++++ spec/models/sales_log_spec.rb | 51 +++++++++++++++++++ spec/requests/form_controller_spec.rb | 28 +++++----- 7 files changed, 135 insertions(+), 20 deletions(-) diff --git a/app/helpers/collection_time_helper.rb b/app/helpers/collection_time_helper.rb index ed0fdf839..34426bab2 100644 --- a/app/helpers/collection_time_helper.rb +++ b/app/helpers/collection_time_helper.rb @@ -1,15 +1,15 @@ module CollectionTimeHelper - def collection_start_year(date) + def collection_start_year_for_date(date) window_end_date = Time.zone.local(date.year, 4, 1) date < window_end_date ? date.year - 1 : date.year end def current_collection_start_year - collection_start_year(Time.zone.now) + collection_start_year_for_date(Time.zone.now) end def collection_start_date(date) - Time.zone.local(collection_start_year(date), 4, 1) + Time.zone.local(collection_start_year_for_date(date), 4, 1) end def date_mid_collection_year_formatted(date) @@ -22,7 +22,7 @@ module CollectionTimeHelper end def collection_end_date(date) - Time.zone.local(collection_start_year(date) + 1, 3, 31).end_of_day + Time.zone.local(collection_start_year_for_date(date) + 1, 3, 31).end_of_day end def current_collection_end_date diff --git a/app/models/log.rb b/app/models/log.rb index 96896bf3d..13f7a5b5b 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -1,4 +1,6 @@ class Log < ApplicationRecord + include CollectionTimeHelper + self.abstract_class = true belongs_to :owning_organisation, class_name: "Organisation", optional: true @@ -87,6 +89,8 @@ class Log < ApplicationRecord end def collection_period_open? + return false if older_than_previous_collection_year? + form.end_date > Time.zone.today end @@ -133,6 +137,13 @@ class Log < ApplicationRecord private + # Handle logs that are older than previous collection start date + def older_than_previous_collection_year? + return false unless startdate + + startdate < previous_collection_start_date + end + def plural_gender_for_person(person_num) gender = public_send("sex#{person_num}".to_sym) return unless gender diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index f99d79cf6..bf3c2af86 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -48,7 +48,7 @@ module Validations::Sales::SaleInformationValidations end def validate_discounted_ownership_value(record) - return unless record.saledate && collection_start_year(record.saledate) >= 2024 + return unless record.saledate && collection_start_year_for_date(record.saledate) >= 2024 return unless record.value && record.deposit && record.ownershipsch return unless record.mortgage || record.mortgageused == 2 return unless record.discount || record.grant || record.type == 29 diff --git a/spec/helpers/collection_time_helper_spec.rb b/spec/helpers/collection_time_helper_spec.rb index 1537926ab..e9ec52292 100644 --- a/spec/helpers/collection_time_helper_spec.rb +++ b/spec/helpers/collection_time_helper_spec.rb @@ -50,7 +50,7 @@ RSpec.describe CollectionTimeHelper do let(:now) { Time.utc(2022, 8, 3) } it "returns the same year as the current start year" do - expect(collection_start_year(now)).to eq(2022) + expect(collection_start_year_for_date(now)).to eq(2022) end it "returns the correct current start date" do @@ -66,7 +66,7 @@ RSpec.describe CollectionTimeHelper do let(:now) { Time.utc(2022, 2, 3) } it "returns the previous year as the current start year" do - expect(collection_start_year(now)).to eq(2021) + expect(collection_start_year_for_date(now)).to eq(2021) end it "returns the correct current start date" do diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 6d45406b2..b33d2fe0f 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -1,6 +1,7 @@ require "rails_helper" require "shared/shared_examples_for_derived_fields" +# rubocop:disable RSpec/MessageChain # rubocop:disable RSpec/AnyInstance RSpec.describe LettingsLog do let(:different_managing_organisation) { create(:organisation) } @@ -3188,5 +3189,55 @@ RSpec.describe LettingsLog do end end end + + describe "#collection_period_open?" do + let(:log) { build(:lettings_log, startdate:) } + + context "when startdate is nil" do + let(:startdate) { nil } + + it "returns false" do + expect(log.collection_period_open?).to eq(true) + end + end + + context "when older_than_previous_collection_year" do + let(:previous_collection_start_date) { Time.zone.local(2050, 4, 1) } + let(:startdate) { previous_collection_start_date - 1.day } + + before do + allow(log).to receive(:previous_collection_start_date).and_return(previous_collection_start_date) + end + + it "returns true" do + expect(log.collection_period_open?).to eq(false) + end + end + + context "when form end date is in the future" do + let(:startdate) { nil } + + before do + allow(log).to receive_message_chain(:form, :end_date).and_return(Time.zone.now + 1.day) + end + + it "returns true" do + expect(log.collection_period_open?).to eq(true) + end + end + + context "when form end date is in the past" do + let(:startdate) { Time.zone.local(2020, 4, 1) } + + before do + allow(log).to receive_message_chain(:form, :end_date).and_return(Time.zone.now - 1.day) + end + + it "returns false" do + expect(log.collection_period_open?).to eq(false) + end + end + end end # rubocop:enable RSpec/AnyInstance +# rubocop:enable RSpec/MessageChain diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index 986130d3f..dae08310e 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -1,6 +1,7 @@ require "rails_helper" require "shared/shared_examples_for_derived_fields" +# rubocop:disable RSpec/MessageChain # rubocop:disable RSpec/AnyInstance RSpec.describe SalesLog, type: :model do let(:owning_organisation) { create(:organisation) } @@ -607,5 +608,55 @@ RSpec.describe SalesLog, type: :model do end end end + + describe "#collection_period_open?" do + let(:log) { build(:sales_log, saledate:) } + + context "when saledate is nil" do + let(:saledate) { nil } + + it "returns false" do + expect(log.collection_period_open?).to eq(true) + end + end + + context "when older_than_previous_collection_year" do + let(:previous_collection_start_date) { Time.zone.local(2050, 4, 1) } + let(:saledate) { previous_collection_start_date - 1.day } + + before do + allow(log).to receive(:previous_collection_start_date).and_return(previous_collection_start_date) + end + + it "returns true" do + expect(log.collection_period_open?).to eq(false) + end + end + + context "when form end date is in the future" do + let(:saledate) { nil } + + before do + allow(log).to receive_message_chain(:form, :end_date).and_return(Time.zone.now + 1.day) + end + + it "returns true" do + expect(log.collection_period_open?).to eq(true) + end + end + + context "when form end date is in the past" do + let(:saledate) { Time.zone.local(2020, 4, 1) } + + before do + allow(log).to receive_message_chain(:form, :end_date).and_return(Time.zone.now - 1.day) + end + + it "returns false" do + expect(log.collection_period_open?).to eq(false) + end + end + end end # rubocop:enable RSpec/AnyInstance +# rubocop:enable RSpec/MessageChain diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index c60448e4e..de2e0b571 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -201,25 +201,27 @@ RSpec.describe FormController, type: :request do describe "GET" do context "with form pages" do - context "when forms exist for multiple years" do - let(:lettings_log_year_1) { create(:lettings_log, owning_organisation: organisation, created_by: user) } - let(:lettings_log_year_2) { create(:lettings_log, :setup_completed, startdate: Time.zone.local(2022, 5, 1), owning_organisation: organisation, created_by: user) } + context "when forms exist" do + let(:lettings_log) { create(:lettings_log, :setup_completed, startdate: Time.zone.local(2022, 5, 1), owning_organisation: organisation, created_by: user) } - before do - Timecop.freeze(Time.zone.local(2021, 5, 1)) - lettings_log_year_1.update!(startdate: Time.zone.local(2021, 5, 1)) - Timecop.unfreeze - allow(lettings_log_year_1.form).to receive(:end_date).and_return(Time.zone.today + 1.day) - end + it "displays the question details" do + get "/lettings-logs/#{lettings_log.id}/tenant-code-test", headers: headers, params: {} - it "displays the correct question details for each lettings log based on form year" do - get "/lettings-logs/#{lettings_log_year_1.id}/tenant-code-test", headers: headers, params: {} - expect(response.body).to include("What is the tenant code?") - get "/lettings-logs/#{lettings_log_year_2.id}/tenant-code-test", headers: headers, params: {} + expect(response).to be_ok expect(response.body).to match("Different question header text for this year - 2023") end end + context "when question not routed to" do + let(:lettings_log) { create(:lettings_log, :setup_completed, startdate: Time.zone.local(2022, 5, 1), owning_organisation: organisation, created_by: user) } + + it "redirects to log" do + get "/lettings-logs/#{lettings_log.id}/scheme", headers: headers, params: {} + + expect(response).to redirect_to("/lettings-logs/#{lettings_log.id}") + end + end + context "when lettings logs are not owned or managed by your organisation" do it "does not show form pages for lettings logs you don't have access to" do get "/lettings-logs/#{unauthorized_lettings_log.id}/person-1-age", headers: headers, params: {} From 37fab3fe2597d2df1a26dbbc8bf010045c5b62c4 Mon Sep 17 00:00:00 2001 From: Jack <113976590+bibblobcode@users.noreply.github.com> Date: Mon, 17 Apr 2023 16:54:59 +0100 Subject: [PATCH 20/27] [CLDC-2260] Move UPRN Known and UPRN questions to same page (#1537) * Set uprn_known to 1 when setting UPRN * Move fake to dev+test gemfile block So that we can use factories in local * Move UPRN known and UPRN questions to single UPRN page --- Gemfile | 2 +- app/models/form/lettings/pages/uprn.rb | 5 +- app/models/form/lettings/pages/uprn_known.rb | 16 ------ app/models/form/lettings/questions/uprn.rb | 13 +++-- .../form/lettings/questions/uprn_known.rb | 2 + .../subsections/property_information.rb | 1 - app/models/form/sales/pages/uprn.rb | 1 + app/models/form/sales/pages/uprn_known.rb | 12 ----- app/models/form/sales/questions/uprn.rb | 13 +++-- app/models/form/sales/questions/uprn_known.rb | 8 +++ .../sales/subsections/property_information.rb | 1 - app/models/log.rb | 1 + .../form/lettings/pages/uprn_known_spec.rb | 51 ------------------- spec/models/form/lettings/pages/uprn_spec.rb | 10 +--- .../lettings/questions/uprn_known_spec.rb | 4 +- .../form/lettings/questions/uprn_spec.rb | 46 ++++++++++------- .../subsections/property_information_spec.rb | 1 - .../form/sales/pages/uprn_known_spec.rb | 33 ------------ spec/models/form/sales/pages/uprn_spec.rb | 2 +- .../form/sales/questions/uprn_known_spec.rb | 4 +- spec/models/form/sales/questions/uprn_spec.rb | 47 ++++++++++------- .../subsections/property_information_spec.rb | 1 - spec/models/lettings_log_spec.rb | 1 + spec/models/sales_log_spec.rb | 1 + 24 files changed, 97 insertions(+), 179 deletions(-) delete mode 100644 app/models/form/lettings/pages/uprn_known.rb delete mode 100644 app/models/form/sales/pages/uprn_known.rb delete mode 100644 spec/models/form/lettings/pages/uprn_known_spec.rb delete mode 100644 spec/models/form/sales/pages/uprn_known_spec.rb diff --git a/Gemfile b/Gemfile index 741f484bd..f23a4db6f 100644 --- a/Gemfile +++ b/Gemfile @@ -70,6 +70,7 @@ group :development, :test do gem "byebug", platforms: %i[mri mingw x64_mingw] gem "dotenv-rails" gem "factory_bot_rails" + gem "faker" gem "pry-byebug" gem "parallel_tests" @@ -93,7 +94,6 @@ group :test do gem "capybara", require: false gem "capybara-lockstep" gem "capybara-screenshot" - gem "faker" gem "rspec-rails", require: false gem "selenium-webdriver", require: false gem "simplecov", require: false diff --git a/app/models/form/lettings/pages/uprn.rb b/app/models/form/lettings/pages/uprn.rb index 7b6b90f1a..f50111798 100644 --- a/app/models/form/lettings/pages/uprn.rb +++ b/app/models/form/lettings/pages/uprn.rb @@ -6,14 +6,13 @@ class Form::Lettings::Pages::Uprn < ::Form::Page def questions @questions ||= [ + Form::Lettings::Questions::UprnKnown.new(nil, nil, self), Form::Lettings::Questions::Uprn.new(nil, nil, self), ] end def routed_to?(log, _current_user = nil) - return false if log.is_supported_housing? - - log.uprn_known == 1 + !log.is_supported_housing? end def skip_text diff --git a/app/models/form/lettings/pages/uprn_known.rb b/app/models/form/lettings/pages/uprn_known.rb deleted file mode 100644 index 1ded1ba82..000000000 --- a/app/models/form/lettings/pages/uprn_known.rb +++ /dev/null @@ -1,16 +0,0 @@ -class Form::Lettings::Pages::UprnKnown < ::Form::Page - def initialize(id, hsh, subsection) - super - @id = "uprn_known" - end - - def questions - @questions ||= [ - Form::Lettings::Questions::UprnKnown.new(nil, nil, self), - ] - end - - def routed_to?(log, _current_user = nil) - !log.is_supported_housing? - end -end diff --git a/app/models/form/lettings/questions/uprn.rb b/app/models/form/lettings/questions/uprn.rb index efe9a4ea4..95ade90ad 100644 --- a/app/models/form/lettings/questions/uprn.rb +++ b/app/models/form/lettings/questions/uprn.rb @@ -5,9 +5,14 @@ class Form::Lettings::Questions::Uprn < ::Form::Question @check_answer_label = "UPRN" @header = "What is the property's UPRN" @type = "text" - @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355." @width = 10 @question_number = 11 + @inferred_check_answers_value = [ + { + "condition" => { "uprn_known" => 0 }, + "value" => "Not known", + }, + ] end def unanswered_error_message @@ -15,6 +20,8 @@ class Form::Lettings::Questions::Uprn < ::Form::Question end def get_extra_check_answer_value(log) + return unless log.uprn_known == 1 + value = [ log.address_line1, log.address_line2, @@ -28,8 +35,4 @@ class Form::Lettings::Questions::Uprn < ::Form::Question "\n\n#{value.join("\n")}" end - - def hidden_in_check_answers?(log, _current_user = nil) - log.uprn_known != 1 - end end diff --git a/app/models/form/lettings/questions/uprn_known.rb b/app/models/form/lettings/questions/uprn_known.rb index d206885fb..816a31ffb 100644 --- a/app/models/form/lettings/questions/uprn_known.rb +++ b/app/models/form/lettings/questions/uprn_known.rb @@ -8,6 +8,8 @@ class Form::Lettings::Questions::UprnKnown < ::Form::Question @answer_options = ANSWER_OPTIONS @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.

You can continue without the UPRN, but it means we will need you to enter the address of the property." + @conditional_for = { "uprn" => [1] } + @hidden_in_check_answers = true end ANSWER_OPTIONS = { diff --git a/app/models/form/lettings/subsections/property_information.rb b/app/models/form/lettings/subsections/property_information.rb index 2e21b8c5a..1290f7cf2 100644 --- a/app/models/form/lettings/subsections/property_information.rb +++ b/app/models/form/lettings/subsections/property_information.rb @@ -30,7 +30,6 @@ class Form::Lettings::Subsections::PropertyInformation < ::Form::Subsection def uprn_questions if form.start_date.year >= 2023 [ - Form::Lettings::Pages::UprnKnown.new(nil, nil, self), Form::Lettings::Pages::Uprn.new(nil, nil, self), Form::Lettings::Pages::UprnConfirmation.new(nil, nil, self), Form::Lettings::Pages::Address.new(nil, nil, self), diff --git a/app/models/form/sales/pages/uprn.rb b/app/models/form/sales/pages/uprn.rb index e1835f8ca..ad247207f 100644 --- a/app/models/form/sales/pages/uprn.rb +++ b/app/models/form/sales/pages/uprn.rb @@ -6,6 +6,7 @@ class Form::Sales::Pages::Uprn < ::Form::Page def questions @questions ||= [ + Form::Sales::Questions::UprnKnown.new(nil, nil, self), Form::Sales::Questions::Uprn.new(nil, nil, self), ] end diff --git a/app/models/form/sales/pages/uprn_known.rb b/app/models/form/sales/pages/uprn_known.rb deleted file mode 100644 index e2cbfe63f..000000000 --- a/app/models/form/sales/pages/uprn_known.rb +++ /dev/null @@ -1,12 +0,0 @@ -class Form::Sales::Pages::UprnKnown < ::Form::Page - def initialize(id, hsh, subsection) - super - @id = "uprn_known" - end - - def questions - @questions ||= [ - Form::Sales::Questions::UprnKnown.new(nil, nil, self), - ] - end -end diff --git a/app/models/form/sales/questions/uprn.rb b/app/models/form/sales/questions/uprn.rb index 7967a2035..6b51260a7 100644 --- a/app/models/form/sales/questions/uprn.rb +++ b/app/models/form/sales/questions/uprn.rb @@ -5,9 +5,14 @@ class Form::Sales::Questions::Uprn < ::Form::Question @check_answer_label = "UPRN" @header = "What is the property's UPRN" @type = "text" - @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355." @width = 10 @question_number = 14 + @inferred_check_answers_value = [ + { + "condition" => { "uprn_known" => 0 }, + "value" => "Not known", + }, + ] end def unanswered_error_message @@ -15,6 +20,8 @@ class Form::Sales::Questions::Uprn < ::Form::Question end def get_extra_check_answer_value(log) + return unless log.uprn_known == 1 + value = [ log.address_line1, log.address_line2, @@ -28,8 +35,4 @@ class Form::Sales::Questions::Uprn < ::Form::Question "\n\n#{value.join("\n")}" end - - def hidden_in_check_answers?(log, _current_user = nil) - log.uprn_known != 1 - end end diff --git a/app/models/form/sales/questions/uprn_known.rb b/app/models/form/sales/questions/uprn_known.rb index b07b0b7d7..22438e662 100644 --- a/app/models/form/sales/questions/uprn_known.rb +++ b/app/models/form/sales/questions/uprn_known.rb @@ -8,6 +8,14 @@ class Form::Sales::Questions::UprnKnown < ::Form::Question @answer_options = ANSWER_OPTIONS @hint_text = "The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.

You can continue without the UPRN, but it means we will need you to enter the address of the property." + @conditional_for = { "uprn" => [1] } + @inferred_check_answers_value = [ + { + "condition" => { "uprn_known" => 0 }, + "value" => "Not known", + }, + ] + @hidden_in_check_answers = true end ANSWER_OPTIONS = { diff --git a/app/models/form/sales/subsections/property_information.rb b/app/models/form/sales/subsections/property_information.rb index 95d8485c8..74a064dca 100644 --- a/app/models/form/sales/subsections/property_information.rb +++ b/app/models/form/sales/subsections/property_information.rb @@ -24,7 +24,6 @@ class Form::Sales::Subsections::PropertyInformation < ::Form::Subsection def uprn_questions if form.start_date.year >= 2023 [ - Form::Sales::Pages::UprnKnown.new(nil, nil, self), Form::Sales::Pages::Uprn.new(nil, nil, self), Form::Sales::Pages::UprnConfirmation.new(nil, nil, self), Form::Sales::Pages::Address.new(nil, nil, self), diff --git a/app/models/log.rb b/app/models/log.rb index 13f7a5b5b..33d3c4547 100644 --- a/app/models/log.rb +++ b/app/models/log.rb @@ -52,6 +52,7 @@ class Log < ApplicationRecord presenter = UprnDataPresenter.new(service.result) + self.uprn_known = 1 self.uprn_confirmed = nil self.address_line1 = presenter.address_line1 self.address_line2 = presenter.address_line2 diff --git a/spec/models/form/lettings/pages/uprn_known_spec.rb b/spec/models/form/lettings/pages/uprn_known_spec.rb deleted file mode 100644 index 27b893a5c..000000000 --- a/spec/models/form/lettings/pages/uprn_known_spec.rb +++ /dev/null @@ -1,51 +0,0 @@ -require "rails_helper" - -RSpec.describe Form::Lettings::Pages::UprnKnown, type: :model do - subject(:page) { described_class.new(page_id, page_definition, subsection) } - - let(:page_id) { nil } - let(:page_definition) { nil } - let(:subsection) { instance_double(Form::Subsection) } - - it "has correct subsection" do - expect(page.subsection).to eq(subsection) - end - - it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[uprn_known]) - end - - it "has the correct id" do - expect(page.id).to eq("uprn_known") - end - - it "has the correct header" do - expect(page.header).to be_nil - end - - it "has the correct description" do - expect(page.description).to be_nil - end - - it "has correct depends_on" do - expect(page.depends_on).to be_nil - end - - describe "has correct routed_to?" do - context "when needstype != 2" do - let(:log) { create(:lettings_log, needstype: nil) } - - it "returns true" do - expect(page.routed_to?(log)).to eq(true) - end - end - - context "when needstype == 2" do - let(:log) { create(:lettings_log, needstype: 2) } - - it "returns true" do - expect(page.routed_to?(log)).to eq(false) - end - end - end -end diff --git a/spec/models/form/lettings/pages/uprn_spec.rb b/spec/models/form/lettings/pages/uprn_spec.rb index 7b480b6b2..d7ddec73f 100644 --- a/spec/models/form/lettings/pages/uprn_spec.rb +++ b/spec/models/form/lettings/pages/uprn_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Form::Lettings::Pages::Uprn, type: :model do end it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[uprn]) + expect(page.questions.map(&:id)).to eq(%w[uprn_known uprn]) end it "has the correct id" do @@ -36,14 +36,6 @@ RSpec.describe Form::Lettings::Pages::Uprn, type: :model do end describe "has correct routed_to?" do - context "when uprn_known != 1" do - let(:log) { create(:lettings_log, uprn_known: 0) } - - it "returns false" do - expect(page.routed_to?(log)).to eq(false) - end - end - context "when uprn_known == 1" do let(:log) { create(:lettings_log, uprn_known: 1) } diff --git a/spec/models/form/lettings/questions/uprn_known_spec.rb b/spec/models/form/lettings/questions/uprn_known_spec.rb index 07eb72f8d..a79185462 100644 --- a/spec/models/form/lettings/questions/uprn_known_spec.rb +++ b/spec/models/form/lettings/questions/uprn_known_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Form::Lettings::Questions::UprnKnown, type: :model do end it "has correct conditional for" do - expect(question.conditional_for).to be_nil + expect(question.conditional_for).to eq({ "uprn" => [1] }) end it "has the correct unanswered_error_message" do @@ -54,6 +54,6 @@ RSpec.describe Form::Lettings::Questions::UprnKnown, type: :model do end it "has the correct hidden_in_check_answers" do - expect(question.hidden_in_check_answers).to be_nil + expect(question.hidden_in_check_answers).to eq(true) end end diff --git a/spec/models/form/lettings/questions/uprn_spec.rb b/spec/models/form/lettings/questions/uprn_spec.rb index 8f6ba047a..5e0be655b 100644 --- a/spec/models/form/lettings/questions/uprn_spec.rb +++ b/spec/models/form/lettings/questions/uprn_spec.rb @@ -36,7 +36,7 @@ RSpec.describe Form::Lettings::Questions::Uprn, type: :model do end it "has the correct hint" do - expect(question.hint_text).to eq("The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.") + expect(question.hint_text).to be_nil end it "has the correct unanswered_error_message" do @@ -61,32 +61,44 @@ RSpec.describe Form::Lettings::Questions::Uprn, type: :model do county: "Test County", postcode_full: "AA1 1AA", la: "E09000003", + uprn_known:, ) end - it "returns formatted value" do - expect(question.get_extra_check_answer_value(log)).to eq( - "\n\n1, Test Street\nTest Town\nTest County\nAA1 1AA\nWestminster", - ) + context "when uprn known nil" do + let(:uprn_known) { nil } + + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end end - end - end - describe "has the correct hidden_in_check_answers" do - context "when uprn_known == 1" do - let(:log) { create(:lettings_log, uprn_known: 1) } + context "when uprn known" do + let(:uprn_known) { 1 } - it "returns false" do - expect(question.hidden_in_check_answers?(log)).to eq(false) + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to eq( + "\n\n1, Test Street\nTest Town\nTest County\nAA1 1AA\nWestminster", + ) + end end - end - context "when uprn_known != 1" do - let(:log) { create(:lettings_log, uprn_known: 0) } + context "when uprn not known" do + let(:uprn_known) { 0 } - it "returns false" do - expect(question.hidden_in_check_answers?(log)).to eq(true) + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end end end end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([{ + "condition" => { + "uprn_known" => 0, + }, + "value" => "Not known", + }]) + end end diff --git a/spec/models/form/lettings/subsections/property_information_spec.rb b/spec/models/form/lettings/subsections/property_information_spec.rb index c1fd9f720..0e0bc7397 100644 --- a/spec/models/form/lettings/subsections/property_information_spec.rb +++ b/spec/models/form/lettings/subsections/property_information_spec.rb @@ -45,7 +45,6 @@ RSpec.describe Form::Lettings::Subsections::PropertyInformation, type: :model do it "has correct pages" do expect(property_information.pages.map(&:id)).to eq( %w[ - uprn_known uprn uprn_confirmation address diff --git a/spec/models/form/sales/pages/uprn_known_spec.rb b/spec/models/form/sales/pages/uprn_known_spec.rb deleted file mode 100644 index 9c18cfa21..000000000 --- a/spec/models/form/sales/pages/uprn_known_spec.rb +++ /dev/null @@ -1,33 +0,0 @@ -require "rails_helper" - -RSpec.describe Form::Sales::Pages::UprnKnown, type: :model do - subject(:page) { described_class.new(page_id, page_definition, subsection) } - - let(:page_id) { nil } - let(:page_definition) { nil } - let(:subsection) { instance_double(Form::Subsection) } - - it "has correct subsection" do - expect(page.subsection).to eq(subsection) - end - - it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[uprn_known]) - end - - it "has the correct id" do - expect(page.id).to eq("uprn_known") - end - - it "has the correct header" do - expect(page.header).to be_nil - end - - it "has the correct description" do - expect(page.description).to be_nil - end - - it "has correct depends_on" do - expect(page.depends_on).to be_nil - end -end diff --git a/spec/models/form/sales/pages/uprn_spec.rb b/spec/models/form/sales/pages/uprn_spec.rb index 5573caf5a..a0cd5b7bc 100644 --- a/spec/models/form/sales/pages/uprn_spec.rb +++ b/spec/models/form/sales/pages/uprn_spec.rb @@ -12,7 +12,7 @@ RSpec.describe Form::Sales::Pages::Uprn, type: :model do end it "has correct questions" do - expect(page.questions.map(&:id)).to eq(%w[uprn]) + expect(page.questions.map(&:id)).to eq(%w[uprn_known uprn]) end it "has the correct id" do diff --git a/spec/models/form/sales/questions/uprn_known_spec.rb b/spec/models/form/sales/questions/uprn_known_spec.rb index 457471568..4016b6e8d 100644 --- a/spec/models/form/sales/questions/uprn_known_spec.rb +++ b/spec/models/form/sales/questions/uprn_known_spec.rb @@ -39,7 +39,7 @@ RSpec.describe Form::Sales::Questions::UprnKnown, type: :model do end it "has correct conditional for" do - expect(question.conditional_for).to be_nil + expect(question.conditional_for).to eq({ "uprn" => [1] }) end it "has the correct unanswered_error_message" do @@ -54,6 +54,6 @@ RSpec.describe Form::Sales::Questions::UprnKnown, type: :model do end it "has the correct hidden_in_check_answers" do - expect(question.hidden_in_check_answers).to be_nil + expect(question.hidden_in_check_answers).to eq(true) end end diff --git a/spec/models/form/sales/questions/uprn_spec.rb b/spec/models/form/sales/questions/uprn_spec.rb index f8fd75942..46e635868 100644 --- a/spec/models/form/sales/questions/uprn_spec.rb +++ b/spec/models/form/sales/questions/uprn_spec.rb @@ -36,7 +36,7 @@ RSpec.describe Form::Sales::Questions::Uprn, type: :model do end it "has the correct hint" do - expect(question.hint_text).to eq("The Unique Property Reference Number (UPRN) is a unique number system created by Ordnance Survey and used by housing providers and sectors UK-wide. For example 10010457355.") + expect(question.hint_text).to be_nil end it "has the correct unanswered_error_message" do @@ -61,33 +61,44 @@ RSpec.describe Form::Sales::Questions::Uprn, type: :model do county: "Test County", postcode_full: "AA1 1AA", la: "E09000003", + uprn_known:, ) end - it "returns formatted value" do - expect(question.get_extra_check_answer_value(log)).to eq( - "\n\n1, Test Street\nTest Town\nTest County\nAA1 1AA\nWestminster", - ) + context "when uprn known nil" do + let(:uprn_known) { nil } + + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end end - end - end - describe "has the correct hidden_in_check_answers" do - context "when uprn_known == 1" do - let(:log) { create(:sales_log) } + context "when uprn known" do + let(:uprn_known) { 1 } - it "returns false" do - log.uprn_known = 1 - expect(question.hidden_in_check_answers?(log)).to eq(false) + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to eq( + "\n\n1, Test Street\nTest Town\nTest County\nAA1 1AA\nWestminster", + ) + end end - end - context "when uprn_known != 1" do - let(:log) { create(:sales_log, uprn_known: 0) } + context "when uprn not known" do + let(:uprn_known) { 0 } - it "returns false" do - expect(question.hidden_in_check_answers?(log)).to eq(true) + it "returns formatted value" do + expect(question.get_extra_check_answer_value(log)).to be_nil + end end end end + + it "has the correct inferred_check_answers_value" do + expect(question.inferred_check_answers_value).to eq([{ + "condition" => { + "uprn_known" => 0, + }, + "value" => "Not known", + }]) + end end diff --git a/spec/models/form/sales/subsections/property_information_spec.rb b/spec/models/form/sales/subsections/property_information_spec.rb index 7a0c57448..559db5ea6 100644 --- a/spec/models/form/sales/subsections/property_information_spec.rb +++ b/spec/models/form/sales/subsections/property_information_spec.rb @@ -41,7 +41,6 @@ RSpec.describe Form::Sales::Subsections::PropertyInformation, type: :model do it "has correct pages" do expect(property_information.pages.map(&:id)).to eq( %w[ - uprn_known uprn uprn_confirmation address diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index b33d2fe0f..03b1aae32 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -3140,6 +3140,7 @@ RSpec.describe LettingsLog do .and change(lettings_log, :postcode_full).from(nil).to("POSTCODE") .and change(lettings_log, :uprn_confirmed).from(1).to(nil) .and change(lettings_log, :county).from("county").to(nil) + .and change(lettings_log, :uprn_known).from(nil).to(1) end end diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index dae08310e..1fc2cf73e 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -559,6 +559,7 @@ RSpec.describe SalesLog, type: :model do .and change(sales_log, :postcode_full).from(nil).to("POSTCODE") .and change(sales_log, :uprn_confirmed).from(1).to(nil) .and change(sales_log, :county).from("county").to(nil) + .and change(sales_log, :uprn_known).from(nil).to(1) end end From f6033b64c0dd70f6c047efef60c55c6bc520e1cb Mon Sep 17 00:00:00 2001 From: James Rose Date: Mon, 17 Apr 2023 17:13:11 +0100 Subject: [PATCH 21/27] Build master manifest file properly when exporting to CDS (#1548) - Internally we building an array of hashes internally, when we should have just built one hash. - This was formatting the master file CSV poorly. --- app/services/exports/lettings_log_export_service.rb | 9 +++++---- .../services/exports/lettings_log_export_service_spec.rb | 9 +++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/services/exports/lettings_log_export_service.rb b/app/services/exports/lettings_log_export_service.rb index 1592f545d..429361913 100644 --- a/app/services/exports/lettings_log_export_service.rb +++ b/app/services/exports/lettings_log_export_service.rb @@ -12,19 +12,20 @@ module Exports start_time = Time.zone.now logs_by_collection = retrieve_lettings_logs(start_time, full_update).group_by(&:collection_start_year) daily_run_number = get_daily_run_number - archives_for_manifest = [] + archives_for_manifest = {} base_number = LogsExport.where(empty_export: false).maximum(:base_number) || 1 available_collection_years.each do |collection| lettings_logs = logs_by_collection.fetch(collection, LettingsLog.none) export = build_export_run(collection, start_time, base_number, full_update) archives = write_export_archive(export, lettings_logs) - archives_for_manifest << archives if archives.any? + archives_for_manifest.merge!(archives) + export.empty_export = archives.empty? export.save! end - write_master_manifest(daily_run_number, archives_for_manifest.flatten) + write_master_manifest(daily_run_number, archives_for_manifest) end private @@ -129,7 +130,7 @@ module Exports headers = ["zip-name", "date-time zipped folder generated", "zip-file-uri"] csv_string = CSV.generate do |csv| csv << headers - archive_datetimes.each do |archive, datetime| + archive_datetimes.each do |(archive, datetime)| csv << [archive, datetime, "#{archive}.zip"] end end diff --git a/spec/services/exports/lettings_log_export_service_spec.rb b/spec/services/exports/lettings_log_export_service_spec.rb index b2aaace1a..349d2fc84 100644 --- a/spec/services/exports/lettings_log_export_service_spec.rb +++ b/spec/services/exports/lettings_log_export_service_spec.rb @@ -135,6 +135,15 @@ RSpec.describe Exports::LettingsLogExportService do export_service.export_xml_lettings_logs end + + it "generates a master manifest with CSV headers" do + actual_content = nil + expected_content = "zip-name,date-time zipped folder generated,zip-file-uri\ncore_2021_2022_apr_mar_f0001_inc0001,2022-05-01 00:00:00 +0100,#{expected_zip_filename}\n" + allow(storage_service).to receive(:write_file).with(expected_master_manifest_filename, any_args) { |_, arg2| actual_content = arg2&.string } + + export_service.export_xml_lettings_logs + expect(actual_content).to eq(expected_content) + end end context "with 23/24 collection period" do From da5e119ac0be372ec29fbfd266aaf405895f2151 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Mon, 17 Apr 2023 17:16:12 +0100 Subject: [PATCH 22/27] CLDC-2140 Scheme and location updates (#1455) * feat: update scheme status so incomplete unless has active locations * feat: update scheme typeahead text * feat: reject incomplete locations * feat: show completed/incomplete locations and validate when completed == 0 * feat: improve copy * feat: change active -> completed * feat: update scheme typeahead text * feat: reject incomplete locations * feat: show completed/incomplete locations and validate when completed == 0 * feat: improve copy * feat: change to confirmed to add clarification in code * feat: update scheme typeahead text * feat: reject incomplete locations * feat: show completed/incomplete locations and validate when completed == 0 * feat: improve copy * feat: update scheme typeahead text * feat: reject incomplete locations * feat: only confirm locations if complete (old) AND save button clicked (new) * feat: add unconfirmed scope * refactor: complete -> confirm * feat: fix tests * feat: update scheme typeahead text * feat: reject incomplete locations * feat: show completed/incomplete locations and validate when completed == 0 * feat: improve copy * feat: update scheme typeahead text * feat: reject incomplete locations * feat: only confirm locations if complete (old) AND save button clicked (new) * feat: add unconfirmed scope * refactor: complete -> confirm * feat: fix tests * feat: fix more tests * feat: fix more tests * refactor: rubocop * refactor: rubocop * refactor: rubocop * feat: add tests for incomplete schemes * refactor: linting * feat: test incomplete count too * feat: test unconfirmed locations aren't options in location_id * feat: test validation * feat: test when scheme is confirmed * feat: test when scheme is confirmed for support user * feat: test when location is confirmed * refactor: linting * refactor: consistent use of factorybot or not within a file * feat: confirm locations when complete even if save button not clicked, and update tests * refactor: simplify * refactor: simplify * refactor: move location helper methods to helpers * refactor: move scheme helper methods to helpers * refactor: formatting * refactor: po response * refactor: review response --- app/controllers/locations_controller.rb | 2 +- app/helpers/locations_helper.rb | 6 ++ app/helpers/question_view_helper.rb | 20 +++++++ .../form/lettings/questions/location_id.rb | 2 +- app/models/form/question.rb | 18 ------ app/models/location.rb | 1 + app/models/scheme.rb | 12 ---- app/models/validations/setup_validations.rb | 8 +++ app/views/form/_select_question.html.erb | 16 +++--- config/locales/en.yml | 1 + .../form/accessible_autocomplete_spec.rb | 3 +- spec/helpers/locations_helper_spec.rb | 2 +- .../lettings/questions/location_id_spec.rb | 26 +++++++-- .../form/lettings/questions/scheme_id_spec.rb | 8 ++- spec/models/lettings_log_spec.rb | 2 +- spec/models/location_spec.rb | 2 +- .../validations/date_validations_spec.rb | 10 ++-- .../validations/setup_validations_spec.rb | 42 ++++++++++++-- spec/requests/locations_controller_spec.rb | 56 +++++++++++++++---- spec/requests/schemes_controller_spec.rb | 49 ++++++++++++++++ 20 files changed, 214 insertions(+), 72 deletions(-) diff --git a/app/controllers/locations_controller.rb b/app/controllers/locations_controller.rb index 876f0e405..ffb2a9c9a 100644 --- a/app/controllers/locations_controller.rb +++ b/app/controllers/locations_controller.rb @@ -134,7 +134,7 @@ class LocationsController < ApplicationController def check_answers; end def confirm - flash[:notice] = "#{@location.postcode} #{@location.startdate.blank? || @location.startdate < Time.zone.now ? 'has been' : 'will be'} added to this scheme" + flash[:notice] = helpers.location_creation_success_notice(@location) redirect_to scheme_locations_path(@scheme) end diff --git a/app/helpers/locations_helper.rb b/app/helpers/locations_helper.rb index 5c51fc88c..5bf7bc8ff 100644 --- a/app/helpers/locations_helper.rb +++ b/app/helpers/locations_helper.rb @@ -78,6 +78,12 @@ module LocationsHelper return govuk_button_link_to "Reactivate this location", scheme_location_new_reactivation_path(location.scheme, location) if location.deactivated? end + def location_creation_success_notice(location) + if location.confirmed + "#{location.postcode} #{location.startdate.blank? || location.startdate.before?(Time.zone.now) ? 'has been' : 'will be'} added to this scheme" + end + end + private ActivePeriod = Struct.new(:from, :to) diff --git a/app/helpers/question_view_helper.rb b/app/helpers/question_view_helper.rb index 3ff84bc19..fdb144c4e 100644 --- a/app/helpers/question_view_helper.rb +++ b/app/helpers/question_view_helper.rb @@ -13,6 +13,26 @@ module QuestionViewHelper } end + def answer_option_synonyms(resource) + return unless resource.instance_of?(Scheme) + + resource.locations.map(&:postcode).join(",") + end + + def answer_option_append(resource) + return unless resource.instance_of?(Scheme) + + confirmed_locations_count = resource.locations.confirmed.size + unconfirmed_locations_count = resource.locations.unconfirmed.size + "#{confirmed_locations_count} completed #{'location'.pluralize(confirmed_locations_count)}, #{unconfirmed_locations_count} incomplete #{'location'.pluralize(unconfirmed_locations_count)}" + end + + def answer_option_hint(resource) + return unless resource.instance_of?(Scheme) + + [resource.primary_client_group, resource.secondary_client_group].compact.join(", ") + end + private def label_size(page_header, conditional, question) diff --git a/app/models/form/lettings/questions/location_id.rb b/app/models/form/lettings/questions/location_id.rb index ee97724b5..94196534f 100644 --- a/app/models/form/lettings/questions/location_id.rb +++ b/app/models/form/lettings/questions/location_id.rb @@ -27,7 +27,7 @@ class Form::Lettings::Questions::LocationId < ::Form::Question def displayed_answer_options(lettings_log, _user = nil) return {} unless lettings_log.scheme - scheme_location_ids = lettings_log.scheme.locations.pluck(:id) + scheme_location_ids = lettings_log.scheme.locations.confirmed.pluck(:id) answer_options.select { |k, _v| scheme_location_ids.include?(k.to_i) } end diff --git a/app/models/form/question.rb b/app/models/form/question.rb index a2196a019..8e8c26739 100644 --- a/app/models/form/question.rb +++ b/app/models/form/question.rb @@ -226,24 +226,6 @@ class Form::Question label end - def answer_option_synonyms(resource) - return unless resource.respond_to?(:synonyms) - - resource.synonyms - end - - def answer_option_append(resource) - return unless resource.respond_to?(:appended_text) - - resource.appended_text - end - - def answer_option_hint(resource) - return unless resource.respond_to?(:hint) - - resource.hint - end - def answer_selected?(log, answer) return false unless type == "select" diff --git a/app/models/location.rb b/app/models/location.rb index c2c2e5b4d..57393d9fb 100644 --- a/app/models/location.rb +++ b/app/models/location.rb @@ -24,6 +24,7 @@ class Location < ApplicationRecord scope :started, -> { where("startdate <= ?", Time.zone.today).or(where(startdate: nil)) } scope :active, -> { where(confirmed: true).and(started) } scope :confirmed, -> { where(confirmed: true) } + scope :unconfirmed, -> { where.not(confirmed: true) } LOCAL_AUTHORITIES = LocalAuthority.all.map { |la| [la.name, la.code] }.to_h diff --git a/app/models/scheme.rb b/app/models/scheme.rb index 8418f9393..75b37dec6 100644 --- a/app/models/scheme.rb +++ b/app/models/scheme.rb @@ -161,18 +161,6 @@ class Scheme < ApplicationRecord ] end - def synonyms - locations.map(&:postcode).join(",") - end - - def appended_text - "#{locations.count { |location| location.startdate.blank? || location.startdate <= Time.zone.today }} locations" - end - - def hint - [primary_client_group, secondary_client_group].filter(&:present?).join(", ") - end - def care_acts_options_with_hints hints = { "Yes – part registered as a care home": "A proportion of units are registered as being a care home." } diff --git a/app/models/validations/setup_validations.rb b/app/models/validations/setup_validations.rb index 0865ebae6..bd12d3249 100644 --- a/app/models/validations/setup_validations.rb +++ b/app/models/validations/setup_validations.rb @@ -20,6 +20,14 @@ module Validations::SetupValidations location_during_startdate_validation(record, :location_id) end + def validate_scheme_has_confirmed_locations_validation(record) + return unless record.scheme + + unless record.scheme.locations.confirmed.any? + record.errors.add :scheme_id, I18n.t("validations.scheme.no_completed_locations") + end + end + def validate_scheme(record) location_during_startdate_validation(record, :scheme_id) scheme_during_startdate_validation(record, :scheme_id) diff --git a/app/views/form/_select_question.html.erb b/app/views/form/_select_question.html.erb index c1ee8c3e0..5f410deef 100644 --- a/app/views/form/_select_question.html.erb +++ b/app/views/form/_select_question.html.erb @@ -7,14 +7,14 @@ "data-controller": "accessible-autocomplete", caption: caption(caption_text, page_header, conditional), hint: { text: question.hint_text&.html_safe }) do %> - <% answers.each do |answer| %> - - <% end %> + <% answers.each do |answer| %> + + <% end %> <% end %> <%= render partial: "form/guidance/#{question.guidance_partial}" if question.bottom_guidance? %> diff --git a/config/locales/en.yml b/config/locales/en.yml index f224a6d63..7b65a8cb2 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -467,6 +467,7 @@ en: during_deactivated_period: "The scheme is already deactivated during this date, please enter a different date" owning_organisation: does_not_own_stock: "Enter an organisation that owns housing stock" + no_completed_locations: "This scheme cannot be chosen as it has no completed locations" location: postcode_blank: "Enter a postcode" diff --git a/spec/features/form/accessible_autocomplete_spec.rb b/spec/features/form/accessible_autocomplete_spec.rb index 15d23fe32..0ff03ec03 100644 --- a/spec/features/form/accessible_autocomplete_spec.rb +++ b/spec/features/form/accessible_autocomplete_spec.rb @@ -75,6 +75,7 @@ RSpec.describe "Accessible Autocomplete" do before do FactoryBot.create(:location, scheme:, postcode: "W6 0ST", startdate: Time.zone.local(2022, 1, 1)) FactoryBot.create(:location, scheme:, postcode: "SE6 1LB", startdate: Time.zone.local(2022, 1, 1)) + FactoryBot.create(:location, scheme:, postcode: nil, startdate: Time.zone.local(2022, 1, 1), confirmed: false) lettings_log.update!(needstype: 2) visit("/lettings-logs/#{lettings_log.id}/scheme") end @@ -87,7 +88,7 @@ RSpec.describe "Accessible Autocomplete" do it "displays appended text next to the options", js: true do find("#lettings-log-scheme-id-field").click.native.send_keys("w", "6", :down, :enter) expect(find(".autocomplete__option", visible: :hidden, text: scheme.service_name)).to be_present - expect(find("span", visible: :hidden, text: "2 locations")).to be_present + expect(find("span", visible: :hidden, text: "2 completed locations, 1 incomplete location")).to be_present end it "displays hint text under the options", js: true do diff --git a/spec/helpers/locations_helper_spec.rb b/spec/helpers/locations_helper_spec.rb index 7926854ec..354b948d4 100644 --- a/spec/helpers/locations_helper_spec.rb +++ b/spec/helpers/locations_helper_spec.rb @@ -178,7 +178,7 @@ RSpec.describe LocationsHelper do context "when location has no local authority" do before do LocalAuthorityLink.create!(local_authority_id: LocalAuthority.find_by(code: "E07000030").id, linked_local_authority_id: LocalAuthority.find_by(code: "E06000063").id) - location.update!(location_code: nil) + location.update!(location_code: nil, confirmed: false) end it "returns correct display attributes" do diff --git a/spec/models/form/lettings/questions/location_id_spec.rb b/spec/models/form/lettings/questions/location_id_spec.rb index afb39ce11..fbe580970 100644 --- a/spec/models/form/lettings/questions/location_id_spec.rb +++ b/spec/models/form/lettings/questions/location_id_spec.rb @@ -48,11 +48,13 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do context "when getting available locations" do let(:scheme) { FactoryBot.create(:scheme) } let!(:lettings_log) do - FactoryBot.create(:lettings_log, owning_organisation: scheme.owning_organisation, scheme:, needstype: 2) + FactoryBot.create(:lettings_log, owning_organisation: scheme.owning_organisation, needstype: 2) end context "when there are no locations" do - it "the displayed_answer_options is an empty hash" do + it "the displayed_answer_options is an empty hash (the scheme should have failed validation anyway so don't validate here)" do + lettings_log.scheme = scheme + lettings_log.save!(validate: false) expect(question.displayed_answer_options(lettings_log)).to eq({}) end end @@ -70,6 +72,7 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do before do FactoryBot.create(:location, scheme:, startdate: Time.utc(2022, 5, 13)) FactoryBot.create(:location, scheme:, startdate: Time.utc(2023, 1, 1)) + lettings_log.update!(scheme:) end it "the displayed_answer_options is an empty hash" do @@ -77,10 +80,11 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do end end - context "and the locations have a no startdate" do + context "and the locations have no startdate" do before do FactoryBot.create(:location, scheme:, startdate: nil) FactoryBot.create(:location, scheme:, startdate: nil) + lettings_log.update!(scheme:) end it "the displayed_answer_options shows the locations" do @@ -92,6 +96,7 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do before do FactoryBot.create(:location, scheme:, startdate: Time.utc(2022, 4, 10)) FactoryBot.create(:location, scheme:, startdate: Time.utc(2022, 5, 12)) + lettings_log.update!(scheme:) end it "the displayed_answer_options shows the locations" do @@ -103,9 +108,22 @@ RSpec.describe Form::Lettings::Questions::LocationId, type: :model do before do FactoryBot.create(:location, scheme:, startdate: Time.utc(2022, 10, 10)) FactoryBot.create(:location, scheme:, startdate: Time.utc(2022, 5, 12)) + lettings_log.update!(scheme:) end - it "the displayed_answer_options shows the active location" do + it "the displayed_answer_options shows only the active location" do + expect(question.displayed_answer_options(lettings_log).count).to eq(1) + end + end + + context "and some locations are not confirmed" do + before do + FactoryBot.create(:location, scheme:, postcode: nil) + FactoryBot.create(:location, scheme:) + lettings_log.update!(scheme:) + end + + it "the displayed_answer_options shows only the confirmed location" do expect(question.displayed_answer_options(lettings_log).count).to eq(1) end end diff --git a/spec/models/form/lettings/questions/scheme_id_spec.rb b/spec/models/form/lettings/questions/scheme_id_spec.rb index d16dc89dc..0b7c8da96 100644 --- a/spec/models/form/lettings/questions/scheme_id_spec.rb +++ b/spec/models/form/lettings/questions/scheme_id_spec.rb @@ -123,13 +123,17 @@ RSpec.describe Form::Lettings::Questions::SchemeId, type: :model do end context "when the question is answered" do - it "returns 'select an option' as selected answer" do + before do + FactoryBot.create(:location, scheme:) + end + + it "returns scheme as selected answer" do lettings_log.update!(scheme:) answers = question.displayed_answer_options(lettings_log).map do |key, value| OpenStruct.new(id: key, name: value.respond_to?(:service_name) ? value.service_name : nil, resource: value) end answers.each do |answer| - if answer.id == scheme.id + if answer.id.to_i == scheme.id expect(question.answer_selected?(lettings_log, answer)).to eq(true) else expect(question.answer_selected?(lettings_log, answer)).to eq(false) diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 03b1aae32..481f7fbbe 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -2339,7 +2339,7 @@ RSpec.describe LettingsLog do describe "resetting invalidated fields" do let(:scheme) { create(:scheme, owning_organisation: created_by_user.organisation) } - let(:location) { create(:location, location_code: "E07000223", scheme:) } + let!(:location) { create(:location, location_code: "E07000223", scheme:) } let(:lettings_log) do create( :lettings_log, diff --git a/spec/models/location_spec.rb b/spec/models/location_spec.rb index 3d10ec777..1fe359136 100644 --- a/spec/models/location_spec.rb +++ b/spec/models/location_spec.rb @@ -788,7 +788,7 @@ RSpec.describe Location, type: :model do before do FactoryBot.create(:location, name: "ABC", postcode: "NW1 8RR", startdate: Time.zone.today) FactoryBot.create(:location, name: "XYZ", postcode: "SE1 6HJ", startdate: Time.zone.today + 1.day) - FactoryBot.create(:location, name: "GHQ", postcode: "EW1 7JK", startdate: Time.zone.today - 1.day, units: nil) + FactoryBot.create(:location, name: "GHQ", postcode: "EW1 7JK", startdate: Time.zone.today - 1.day, units: nil, confirmed: false) FactoryBot.create(:location, name: "GHQ", postcode: "EW1 7JK", startdate: nil) end diff --git a/spec/models/validations/date_validations_spec.rb b/spec/models/validations/date_validations_spec.rb index 239be2853..b9c747e9c 100644 --- a/spec/models/validations/date_validations_spec.rb +++ b/spec/models/validations/date_validations_spec.rb @@ -4,9 +4,9 @@ RSpec.describe Validations::DateValidations do subject(:date_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::DateValidations } } - let(:record) { FactoryBot.create(:lettings_log) } - let(:scheme) { FactoryBot.create(:scheme, end_date: Time.zone.today - 5.days) } - let(:scheme_no_end_date) { FactoryBot.create(:scheme, end_date: nil) } + let(:record) { create(:lettings_log) } + let(:scheme) { create(:scheme, end_date: Time.zone.today - 5.days) } + let(:scheme_no_end_date) { create(:scheme, end_date: nil) } describe "tenancy start date" do it "must be a valid date" do @@ -165,7 +165,7 @@ RSpec.describe Validations::DateValidations do let(:scheme) { create(:scheme) } before do - FactoryBot.create(:location, scheme:) + create(:location, scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 4), reactivation_date: Time.zone.local(2022, 8, 4), scheme:) scheme.reload end @@ -190,7 +190,7 @@ RSpec.describe Validations::DateValidations do let(:scheme) { create(:scheme) } before do - FactoryBot.create(:location, scheme:) + create(:location, scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 4), reactivation_date: Time.zone.local(2022, 8, 4), scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 2), reactivation_date: Time.zone.local(2022, 8, 3), scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 1), reactivation_date: Time.zone.local(2022, 9, 4), scheme:) diff --git a/spec/models/validations/setup_validations_spec.rb b/spec/models/validations/setup_validations_spec.rb index 16d52fb07..5bb180aa2 100644 --- a/spec/models/validations/setup_validations_spec.rb +++ b/spec/models/validations/setup_validations_spec.rb @@ -4,7 +4,7 @@ RSpec.describe Validations::SetupValidations do subject(:setup_validator) { setup_validator_class.new } let(:setup_validator_class) { Class.new { include Validations::SetupValidations } } - let(:record) { FactoryBot.create(:lettings_log) } + let(:record) { create(:lettings_log) } describe "tenancy start date" do context "when in 22/23 collection" do @@ -188,7 +188,7 @@ RSpec.describe Validations::SetupValidations do let(:scheme) { create(:scheme, created_at: Time.zone.local(2022, 4, 1)) } before do - FactoryBot.create(:location, scheme:) + create(:location, scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 4), reactivation_date: Time.zone.local(2022, 8, 4), scheme:) scheme.reload end @@ -213,7 +213,7 @@ RSpec.describe Validations::SetupValidations do let(:scheme) { create(:scheme, created_at: Time.zone.local(2022, 4, 1)) } before do - FactoryBot.create(:location, scheme:) + create(:location, scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 4), reactivation_date: Time.zone.local(2022, 8, 4), scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 2), reactivation_date: Time.zone.local(2022, 8, 3), scheme:) create(:scheme_deactivation_period, deactivation_date: Time.zone.local(2022, 6, 1), reactivation_date: Time.zone.local(2022, 9, 4), scheme:) @@ -310,8 +310,8 @@ RSpec.describe Validations::SetupValidations do end describe "#validate_organisation" do - let(:user) { FactoryBot.create(:user) } - let(:other_organisation) { FactoryBot.create(:organisation) } + let(:user) { create(:user) } + let(:other_organisation) { create(:organisation) } it "validates if neither managing nor owning organisation is the same as created_by user organisation" do record.created_by = user @@ -368,4 +368,36 @@ RSpec.describe Validations::SetupValidations do expect(record.errors["managing_organisation_id"]).to be_empty end end + + describe "#validate_scheme_has_confirmed_locations_validation" do + let(:scheme) { create(:scheme) } + + context "with a scheme that has no confirmed locations" do + before do + create(:location, scheme:, postcode: nil) + scheme.reload + end + + it "produces an error" do + record.scheme = scheme + setup_validator.validate_scheme_has_confirmed_locations_validation(record) + expect(record.errors["scheme_id"]) + .to include(match I18n.t("validations.scheme.no_completed_locations")) + end + end + + context "with a scheme that has confirmed locations" do + before do + create(:location, scheme:) + scheme.reload + end + + it "does not produce an error" do + record.scheme = scheme + setup_validator.validate_scheme_has_confirmed_locations_validation(record) + expect(record.errors["scheme_id"]) + .to be_empty + end + end + end end diff --git a/spec/requests/locations_controller_spec.rb b/spec/requests/locations_controller_spec.rb index 154d18735..ab9dcd268 100644 --- a/spec/requests/locations_controller_spec.rb +++ b/spec/requests/locations_controller_spec.rb @@ -1263,14 +1263,30 @@ RSpec.describe LocationsController, type: :request do patch "/schemes/#{scheme.id}/locations/#{location.id}/confirm", params: end - it "confirms location" do - expect(Location.last.confirmed).to eq(true) + context "when location is complete" do + it "confirms location" do + expect(Location.last.confirmed).to eq(true) + end + + it "redirects correctly and displays success banner" do + follow_redirect! + expect(page).to have_content("Success") + expect(page).to have_content("added to this scheme") + end end - it "redirects correctly and displays success banner" do - follow_redirect! - expect(page).to have_content("Success") - expect(page).to have_content("added to this scheme") + context "when location is not complete" do + let(:location) { FactoryBot.create(:location, scheme:, startdate: Time.zone.local(2000, 1, 1), postcode: nil) } + + it "does not confirm location" do + expect(Location.last.confirmed).to eq(false) + end + + it "redirects correctly and does not display success banner" do + follow_redirect! + expect(page).not_to have_content("Success") + expect(page).not_to have_content("added to this scheme") + end end end @@ -1308,14 +1324,30 @@ RSpec.describe LocationsController, type: :request do patch "/schemes/#{scheme.id}/locations/#{location.id}/confirm", params: end - it "confirms location" do - expect(Location.last.confirmed).to eq(true) + context "when location is complete" do + it "confirms location" do + expect(Location.last.confirmed).to eq(true) + end + + it "redirects correctly and displays success banner" do + follow_redirect! + expect(page).to have_content("Success") + expect(page).to have_content("added to this scheme") + end end - it "redirects correctly and displays success banner" do - follow_redirect! - expect(page).to have_content("Success") - expect(page).to have_content("added to this scheme") + context "when location is not complete" do + let(:location) { FactoryBot.create(:location, scheme:, startdate: Time.zone.local(2000, 1, 1), postcode: nil) } + + it "does not confirm location" do + expect(Location.last.confirmed).to eq(false) + end + + it "redirects correctly and does not display success banner" do + follow_redirect! + expect(page).not_to have_content("Success") + expect(page).not_to have_content("added to this scheme") + end end end diff --git a/spec/requests/schemes_controller_spec.rb b/spec/requests/schemes_controller_spec.rb index fb9150940..1a450a922 100644 --- a/spec/requests/schemes_controller_spec.rb +++ b/spec/requests/schemes_controller_spec.rb @@ -658,6 +658,26 @@ RSpec.describe SchemesController, type: :request do end end + context "when scheme is completed but not yet confirmed" do + let(:params) { { scheme: { page: "check-answers" } } } + + it "is not confirmed" do + expect(scheme_to_update.confirmed).to eq(nil) + end + + context "when confirming finished scheme" do + let(:params) { { scheme: { confirmed: true, page: "check-answers" } } } + + before do + scheme_to_update.reload + end + + it "confirms scheme" do + expect(scheme_to_update.confirmed).to eq(true) + end + end + end + context "when required params are missing" do let(:params) do { scheme: { @@ -921,6 +941,35 @@ RSpec.describe SchemesController, type: :request do patch "/schemes/#{scheme_to_update.id}", params: end + context "when confirming unfinished scheme" do + let(:params) { { scheme: { owning_organisation_id: user.organisation.id, arrangement_type: nil, confirmed: true, page: "check-answers" } } } + + it "does not allow the scheme to be confirmed" do + expect(response).to have_http_status(:unprocessable_entity) + expect(page).to have_content(I18n.t("activerecord.errors.models.scheme.attributes.arrangement_type.invalid")) + end + end + + context "when scheme is completed but not yet confirmed" do + let(:params) { { scheme: { page: "check-answers" } } } + + it "is not confirmed" do + expect(scheme_to_update.confirmed).to eq(nil) + end + + context "when confirming finished scheme" do + let(:params) { { scheme: { confirmed: true, page: "check-answers" } } } + + before do + scheme_to_update.reload + end + + it "confirms scheme" do + expect(scheme_to_update.confirmed).to eq(true) + end + end + end + context "when required params are missing" do let(:params) do { scheme: { From efd83d4aa8cf100975c6756ccabe2807dcb69671 Mon Sep 17 00:00:00 2001 From: natdeanlewissoftwire <94526761+natdeanlewissoftwire@users.noreply.github.com> Date: Mon, 17 Apr 2023 17:16:47 +0100 Subject: [PATCH 23/27] CLDC-1985 Fix error message persistence bug (#1515) * feat: assign simultaneously * feat: assign simultaneously * feat: revert * feat: fix back persistence behaviour and update similar issues elsewhere, also remove redundant back text in govuk back links * feat: add previous_page_redirect_paths to avoid infinite loops * feat: leave here to avoid possible loops * feat: leave here to avoid possible loops * feat: add check answers page behaviour * refactor: tweak * feat: make tests pass, simplify code and incorporate tasklist/check answers back routing * feat: update tests * refactor: lint --- app/controllers/form_controller.rb | 6 +-- app/helpers/tasklist_helper.rb | 2 +- app/models/form.rb | 49 +++++++++++++------ .../validations/financial_validations.rb | 2 +- app/views/form/page.html.erb | 2 +- app/views/locations/availability.erb | 1 - app/views/locations/check_answers.html.erb | 1 - app/views/locations/index.html.erb | 1 - app/views/locations/local_authority.html.erb | 1 - .../locations/mobility_standards.html.erb | 1 - app/views/locations/name.html.erb | 1 - app/views/locations/postcode.html.erb | 1 - app/views/locations/show.html.erb | 1 - app/views/locations/toggle_active.html.erb | 1 - app/views/locations/type_of_unit.html.erb | 1 - app/views/locations/units.html.erb | 1 - app/views/schemes/confirm_secondary.html.erb | 1 - app/views/schemes/details.html.erb | 5 +- app/views/schemes/edit_name.html.erb | 5 +- app/views/schemes/new.html.erb | 5 +- .../schemes/primary_client_group.html.erb | 5 +- .../schemes/secondary_client_group.html.erb | 1 - app/views/schemes/show.html.erb | 1 - app/views/schemes/support.html.erb | 1 - app/views/schemes/toggle_active.html.erb | 1 - spec/features/form/form_navigation_spec.rb | 2 +- spec/models/form_spec.rb | 21 ++++---- 27 files changed, 53 insertions(+), 67 deletions(-) diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index c584e40ee..e7bbf38ec 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -122,11 +122,9 @@ private def successful_redirect_path if is_referrer_check_answers? - page_ids = form.subsection_for_page(@page).pages.map(&:id) - page_index = page_ids.index(@page.id) - next_page_id = form.next_page(@page, @log, current_user) + next_page_id = form.next_page_id(@page, @log, current_user) next_page = form.get_page(next_page_id) - previous_page = form.previous_page(page_ids, page_index, @log, current_user) + previous_page = form.previous_page_id(@page, @log, current_user) if next_page&.interruption_screen? || next_page_id == previous_page return send("#{@log.class.name.underscore}_#{next_page_id}_path", @log, { referrer: "check_answers" }) diff --git a/app/helpers/tasklist_helper.rb b/app/helpers/tasklist_helper.rb index 9487d13a5..6a12cff29 100644 --- a/app/helpers/tasklist_helper.rb +++ b/app/helpers/tasklist_helper.rb @@ -15,7 +15,7 @@ module TasklistHelper if subsection.pages.first.routed_to?(log, current_user) subsection.pages.first.id else - log.form.next_page(subsection.pages.first, log, current_user) + log.form.next_page_id(subsection.pages.first, log, current_user) end end diff --git a/app/models/form.rb b/app/models/form.rb index 8f9dc47f9..80fed4444 100644 --- a/app/models/form.rb +++ b/app/models/form.rb @@ -61,30 +61,54 @@ class Form subsections.find { |s| s.pages.find { |p| p.id == page.id } } end - def next_page(page, log, current_user) + def next_page_id(page, log, current_user) return page.next_unresolved_page_id || :check_answers if log.unresolved page_ids = subsection_for_page(page).pages.map(&:id) page_index = page_ids.index(page.id) page_id = if page.interruption_screen? && log[page.questions[0].id] == 1 && page.routed_to?(log, current_user) - previous_page(page_ids, page_index, log, current_user) + previous_page_id(page, log, current_user) else page_ids[page_index + 1] end - nxt_page = get_page(page_id) + next_page = get_page(page_id) - return :check_answers if nxt_page.nil? - return nxt_page.id if nxt_page.routed_to?(log, current_user) + return :check_answers if next_page.nil? + return next_page.id if next_page.routed_to?(log, current_user) - next_page(nxt_page, log, current_user) + next_page_id(next_page, log, current_user) end def next_page_redirect_path(page, log, current_user) - nxt_page = next_page(page, log, current_user) - if nxt_page == :check_answers + next_page_id = next_page_id(page, log, current_user) + if next_page_id == :check_answers "#{type}_log_#{subsection_for_page(page).id}_check_answers_path" else - "#{type}_log_#{nxt_page}_path" + "#{type}_log_#{next_page_id}_path" + end + end + + def previous_page_id(page, log, current_user) + page_ids = subsection_for_page(page).pages.map(&:id) + page_index = page_ids.index(page.id) + return :tasklist if page_index.zero? + + page_id = page_ids[page_index - 1] + previous_page = get_page(page_id) + + return previous_page.id if previous_page.routed_to?(log, current_user) + + previous_page_id(previous_page, log, current_user) + end + + def previous_page_redirect_path(page, log, current_user, referrer) + previous_page_id = previous_page_id(page, log, current_user) + if referrer == "check_answers" + "#{type}_log_#{subsection_for_page(page).id}_check_answers_path" + elsif previous_page_id == :tasklist + "#{type}_log_path" + else + "#{type}_log_#{previous_page_id}_path" end end @@ -206,13 +230,6 @@ class Form questions.select { |q| q.type == "numeric" } end - def previous_page(page_ids, page_index, log, current_user) - prev_page = get_page(page_ids[page_index - 1]) - return prev_page.id if prev_page.routed_to?(log, current_user) - - previous_page(page_ids, page_index - 1, log, current_user) - end - def send_chain(arr, log) Array(arr).inject(log) { |o, a| o.public_send(*a) } end diff --git a/app/models/validations/financial_validations.rb b/app/models/validations/financial_validations.rb index d328054e9..857c4e193 100644 --- a/app/models/validations/financial_validations.rb +++ b/app/models/validations/financial_validations.rb @@ -138,7 +138,7 @@ module Validations::FinancialValidations message = I18n.t("validations.financial.carehome.out_of_range", period:, min_chcharge:, max_chcharge:) record.errors.add :period, message - record.errors.add :chcharge, :out_of_range, message: message + record.errors.add :chcharge, :out_of_range, message: end end end diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index 45711b0f1..9b4d14d9d 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -1,7 +1,7 @@ <% content_for :title, @page.header.presence || @page.questions.first.header.html_safe %> <% content_for :before_content do %> - <%= govuk_back_link(href: "javascript:history.back()") %> + <%= govuk_back_link(href: send(@log.form.previous_page_redirect_path(@page, @log, current_user, params[:referrer]), @log)) %> <% end %>

diff --git a/app/views/locations/availability.erb b/app/views/locations/availability.erb index 279c5110c..8a00ddc89 100644 --- a/app/views/locations/availability.erb +++ b/app/views/locations/availability.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: params[:referrer] == "check_answers" ? scheme_location_check_answers_path(@scheme, @location, route: params[:route]) : scheme_location_mobility_standards_path(@scheme, @location, route: params[:route]), ) %> <% end %> diff --git a/app/views/locations/check_answers.html.erb b/app/views/locations/check_answers.html.erb index 11272b5a9..b460ca464 100644 --- a/app/views/locations/check_answers.html.erb +++ b/app/views/locations/check_answers.html.erb @@ -3,7 +3,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: case params[:route] when "locations" scheme_locations_path(@scheme) diff --git a/app/views/locations/index.html.erb b/app/views/locations/index.html.erb index 469768b11..7294b9729 100644 --- a/app/views/locations/index.html.erb +++ b/app/views/locations/index.html.erb @@ -4,7 +4,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: "/schemes/#{@scheme.id}", ) %> <% end %> diff --git a/app/views/locations/local_authority.html.erb b/app/views/locations/local_authority.html.erb index 69b36b5be..347f85866 100644 --- a/app/views/locations/local_authority.html.erb +++ b/app/views/locations/local_authority.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: case params[:referrer] when "check_local_authority" scheme_location_check_answers_path(@scheme, @location, route: params[:route]) diff --git a/app/views/locations/mobility_standards.html.erb b/app/views/locations/mobility_standards.html.erb index 42bdb4bcf..da08f8bfa 100644 --- a/app/views/locations/mobility_standards.html.erb +++ b/app/views/locations/mobility_standards.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: params[:referrer] == "check_answers" ? scheme_location_check_answers_path(@scheme, @location, route: params[:route]) : scheme_location_type_of_unit_path(@scheme, @location, route: params[:route]), ) %> <% end %> diff --git a/app/views/locations/name.html.erb b/app/views/locations/name.html.erb index 322a1da22..e5853a71f 100644 --- a/app/views/locations/name.html.erb +++ b/app/views/locations/name.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: case params[:referrer] when "check_answers" scheme_location_check_answers_path(@scheme, @location, route: params[:route]) diff --git a/app/views/locations/postcode.html.erb b/app/views/locations/postcode.html.erb index 5ede463ad..fe0505926 100644 --- a/app/views/locations/postcode.html.erb +++ b/app/views/locations/postcode.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: if params[:referrer] == "check_answers" scheme_location_check_answers_path(@scheme, @location, route: params[:route]) else diff --git a/app/views/locations/show.html.erb b/app/views/locations/show.html.erb index 79876e5b8..299a19357 100644 --- a/app/views/locations/show.html.erb +++ b/app/views/locations/show.html.erb @@ -3,7 +3,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: scheme_locations_path(@scheme), ) %> <% end %> diff --git a/app/views/locations/toggle_active.html.erb b/app/views/locations/toggle_active.html.erb index 7b995b2b5..c7c8270b5 100644 --- a/app/views/locations/toggle_active.html.erb +++ b/app/views/locations/toggle_active.html.erb @@ -3,7 +3,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: scheme_location_path(@location.scheme, @location), ) %> <% end %> diff --git a/app/views/locations/type_of_unit.html.erb b/app/views/locations/type_of_unit.html.erb index 5ff4ed3f1..45b76ef67 100644 --- a/app/views/locations/type_of_unit.html.erb +++ b/app/views/locations/type_of_unit.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: params[:referrer] == "check_answers" ? scheme_location_check_answers_path(@scheme, @location, route: params[:route]) : scheme_location_units_path(@scheme, @location, route: params[:route]), ) %> <% end %> diff --git a/app/views/locations/units.html.erb b/app/views/locations/units.html.erb index 30a9b3eff..12365adbb 100644 --- a/app/views/locations/units.html.erb +++ b/app/views/locations/units.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: params[:referrer] == "check_answers" ? scheme_location_check_answers_path(@scheme, @location, route: params[:route]) : scheme_location_name_path(@scheme, @location, route: params[:route]), ) %> <% end %> diff --git a/app/views/schemes/confirm_secondary.html.erb b/app/views/schemes/confirm_secondary.html.erb index c145e573d..e267b3289 100644 --- a/app/views/schemes/confirm_secondary.html.erb +++ b/app/views/schemes/confirm_secondary.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: request.query_parameters["check_answers"] ? "/schemes/#{@scheme.id}/check-answers" : "/schemes/#{@scheme.id}/primary-client-group", ) %> <% end %> diff --git a/app/views/schemes/details.html.erb b/app/views/schemes/details.html.erb index 4d45213f3..0e4f3a7d9 100644 --- a/app/views/schemes/details.html.erb +++ b/app/views/schemes/details.html.erb @@ -1,10 +1,7 @@ <% content_for :title, "Create a new supported housing scheme" %> <% content_for :before_content do %> - <%= govuk_back_link( - text: "Back", - href: :back, - ) %> + <%= govuk_back_link(href: :back) %> <% end %> <%= form_for(@scheme, method: :patch) do |f| %> diff --git a/app/views/schemes/edit_name.html.erb b/app/views/schemes/edit_name.html.erb index 04e28c93a..1dc8bc147 100644 --- a/app/views/schemes/edit_name.html.erb +++ b/app/views/schemes/edit_name.html.erb @@ -1,10 +1,7 @@ <% content_for :title, "Scheme details" %> <% content_for :before_content do %> - <%= govuk_back_link( - text: "Back", - href: :back, - ) %> + <%= govuk_back_link(href: :back) %> <% end %> <%= form_for(@scheme, method: :patch) do |f| %> diff --git a/app/views/schemes/new.html.erb b/app/views/schemes/new.html.erb index ff4f4d3a9..81c5febbf 100644 --- a/app/views/schemes/new.html.erb +++ b/app/views/schemes/new.html.erb @@ -6,10 +6,7 @@ <% content_for :title, "Create a new supported housing scheme" %> <% content_for :before_content do %> - <%= govuk_back_link( - text: "Back", - href: "javascript:history.go(-1);", - ) %> + <%= govuk_back_link(href: "javascript:history.back()") %> <% end %>

diff --git a/app/views/schemes/primary_client_group.html.erb b/app/views/schemes/primary_client_group.html.erb index 610e916f4..8fe852c89 100644 --- a/app/views/schemes/primary_client_group.html.erb +++ b/app/views/schemes/primary_client_group.html.erb @@ -7,10 +7,7 @@ <% end %> <% content_for :before_content do %> - <%= govuk_back_link( - text: "Back", - href: back_button_path, - ) %> + <%= govuk_back_link(href: back_button_path) %> <% end %> <%= form_for(@scheme, method: :patch) do |f| %> diff --git a/app/views/schemes/secondary_client_group.html.erb b/app/views/schemes/secondary_client_group.html.erb index 4f48dab00..fe292b1c2 100644 --- a/app/views/schemes/secondary_client_group.html.erb +++ b/app/views/schemes/secondary_client_group.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: request.query_parameters["check_answers"] ? "/schemes/#{@scheme.id}/check-answers" : "/schemes/#{@scheme.id}/confirm-secondary-client-group", ) %> <% end %> diff --git a/app/views/schemes/show.html.erb b/app/views/schemes/show.html.erb index 5ef55f9f4..beb4508e0 100644 --- a/app/views/schemes/show.html.erb +++ b/app/views/schemes/show.html.erb @@ -3,7 +3,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: "/schemes", ) %> <% end %> diff --git a/app/views/schemes/support.html.erb b/app/views/schemes/support.html.erb index 0c06a059f..23948978b 100644 --- a/app/views/schemes/support.html.erb +++ b/app/views/schemes/support.html.erb @@ -2,7 +2,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: request.query_parameters["check_answers"] ? "/schemes/#{@scheme.id}/check-answers" : "/schemes/#{@scheme.id}/secondary-client-group", ) %> <% end %> diff --git a/app/views/schemes/toggle_active.html.erb b/app/views/schemes/toggle_active.html.erb index f2ecc4a1a..e989be995 100644 --- a/app/views/schemes/toggle_active.html.erb +++ b/app/views/schemes/toggle_active.html.erb @@ -3,7 +3,6 @@ <% content_for :before_content do %> <%= govuk_back_link( - text: "Back", href: scheme_details_path(@scheme), ) %> <% end %> diff --git a/spec/features/form/form_navigation_spec.rb b/spec/features/form/form_navigation_spec.rb index aa0223616..6fdec8366 100644 --- a/spec/features/form/form_navigation_spec.rb +++ b/spec/features/form/form_navigation_spec.rb @@ -110,7 +110,7 @@ RSpec.describe "Form Navigation" do click_button("Save and continue") click_link(text: "Back") click_link(text: "Back") - expect(page).to have_current_path("/lettings-logs") + expect(page).to have_current_path("/lettings-logs/#{id}") end context "when changing an answer from the check answers page", js: true do diff --git a/spec/models/form_spec.rb b/spec/models/form_spec.rb index 327a79a2f..f2a80efe3 100644 --- a/spec/models/form_spec.rb +++ b/spec/models/form_spec.rb @@ -17,11 +17,11 @@ RSpec.describe Form, type: :model do let(:conditional_section_complete_lettings_log) { FactoryBot.build(:lettings_log, :conditional_section_complete) } describe ".next_page" do - let(:previous_page) { form.get_page("person_1_age") } + let(:previous_page_id) { form.get_page("person_1_age") } let(:value_check_previous_page) { form.get_page("net_income_value_check") } it "returns the next page given the previous" do - expect(form.next_page(previous_page, lettings_log, user)).to eq("person_1_gender") + expect(form.next_page_id(previous_page_id, lettings_log, user)).to eq("person_1_gender") end context "when the current page is a value check page" do @@ -33,12 +33,12 @@ RSpec.describe Form, type: :model do it "returns the previous page if answer is `No` and the page is routed to" do lettings_log.net_income_value_check = 1 - expect(form.next_page(value_check_previous_page, lettings_log, user)).to eq("net_income") + expect(form.next_page_id(value_check_previous_page, lettings_log, user)).to eq("net_income") end it "returns the next page if answer is `Yes` answer and the page is routed to" do lettings_log.net_income_value_check = 0 - expect(form.next_page(value_check_previous_page, lettings_log, user)).to eq("net_income_uc_proportion") + expect(form.next_page_id(value_check_previous_page, lettings_log, user)).to eq("net_income_uc_proportion") end end end @@ -46,31 +46,30 @@ RSpec.describe Form, type: :model do describe ".previous_page" do context "when the current page is not a value check page" do let!(:subsection) { form.get_subsection("conditional_question") } - let!(:page_ids) { subsection.pages.map(&:id) } before do lettings_log.preg_occ = 2 end it "returns the previous page if the page is routed to" do - page_index = page_ids.index("conditional_question_no_second_page") - expect(form.previous_page(page_ids, page_index, lettings_log, user)).to eq("conditional_question_no_page") + page = subsection.pages.find { |p| p.id == "conditional_question_no_second_page" } + expect(form.previous_page_id(page, lettings_log, user)).to eq("conditional_question_no_page") end it "returns the page before the previous one if the previous page is not routed to" do - page_index = page_ids.index("conditional_question_no_page") - expect(form.previous_page(page_ids, page_index, lettings_log, user)).to eq("conditional_question") + page = subsection.pages.find { |p| p.id == "conditional_question_no_page" } + expect(form.previous_page_id(page, lettings_log, user)).to eq("conditional_question") end end end describe "next_page_redirect_path" do - let(:previous_page) { form.get_page("net_income") } + let(:previous_page_id) { form.get_page("net_income") } let(:last_previous_page) { form.get_page("housing_benefit") } let(:previous_conditional_page) { form.get_page("conditional_question") } it "returns a correct page path if there is no conditional routing" do - expect(form.next_page_redirect_path(previous_page, lettings_log, user)).to eq("lettings_log_net_income_uc_proportion_path") + expect(form.next_page_redirect_path(previous_page_id, lettings_log, user)).to eq("lettings_log_net_income_uc_proportion_path") end it "returns a check answers page if previous page is the last page" do From eb8d1c2adef89ab7a4c6e7aab53b0f60bdfbcd23 Mon Sep 17 00:00:00 2001 From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com> Date: Tue, 18 Apr 2023 09:16:55 +0100 Subject: [PATCH 24/27] Add error to main field when validating other field (#1554) --- app/models/validations/shared_validations.rb | 1 + .../lettings_logs_import_service_spec.rb | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index 0a0c3f63b..6a32563a7 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -7,6 +7,7 @@ module Validations::SharedValidations main_field_label = main_label || main_field.to_s.humanize(capitalize: false) other_field_label = other_label || other_field.to_s.humanize(capitalize: false) if record[main_field] == value_other && record[other_field].blank? + record.errors.add main_field.to_sym, I18n.t("validations.other_field_missing", main_field_label:, other_field_label:) record.errors.add other_field.to_sym, I18n.t("validations.other_field_missing", main_field_label:, other_field_label:) end diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index f144a798d..11a25ff22 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -323,6 +323,34 @@ RSpec.describe Imports::LettingsLogsImportService do end end + context "and is a other tenancy but missing tenancyother" do + let(:lettings_log_id) { "0b4a68df-30cc-474a-93c0-a56ce8fdad3b" } + + before do + lettings_log_xml.at_xpath("//meta:status").content = "saved" + lettings_log_xml.at_xpath("//xmlns:Q2b").content = "3" + lettings_log_xml.at_xpath("//xmlns:Q2ba").content = "" + end + + it "intercepts the relevant validation error" do + allow(logger).to receive(:warn) + + expect { lettings_log_service.send(:create_log, lettings_log_xml) } + .not_to raise_error + end + + it "clears out the invalid answers" do + allow(logger).to receive(:warn) + + lettings_log_service.send(:create_log, lettings_log_xml) + lettings_log = LettingsLog.find_by(old_id: lettings_log_id) + + expect(lettings_log).not_to be_nil + expect(lettings_log.tenancy).to be_nil + expect(lettings_log.tenancyother).to be_nil + end + end + context "and this is an internal transfer from a non social housing" do before do lettings_log_xml.at_xpath("//xmlns:Q11").content = "9 Residential care home" From f57b93045d4e8cc947b0ee144d1949712aacca0e Mon Sep 17 00:00:00 2001 From: Arthur Campbell <51094020+arfacamble@users.noreply.github.com> Date: Tue, 18 Apr 2023 09:30:49 +0100 Subject: [PATCH 25/27] Revert "CLDC-1945 numeric questions decimal letter entry (#1442)" (#1555) This reverts commit c78f2ef5f97b79f3ad94f12ab6b0dab0ea65a28b. --- app/models/form/lettings/questions/beds.rb | 4 +- app/models/form/lettings/questions/offered.rb | 2 +- .../lettings/questions/offered_social_let.rb | 2 +- app/models/form/sales/questions/age1.rb | 1 - app/models/form/sales/questions/age2.rb | 1 - .../form/sales/questions/deposit_amount.rb | 3 +- .../form/sales/questions/deposit_discount.rb | 1 - app/models/form/sales/questions/discount.rb | 1 - app/models/form/sales/questions/equity.rb | 1 - app/models/form/sales/questions/grant.rb | 1 - .../form/sales/questions/leasehold_charges.rb | 1 - .../form/sales/questions/monthly_rent.rb | 1 - .../form/sales/questions/mortgage_amount.rb | 1 - .../form/sales/questions/mortgage_length.rb | 1 - .../questions/number_of_others_in_property.rb | 1 - app/models/form/sales/questions/person_age.rb | 1 - .../form/sales/questions/previous_bedrooms.rb | 1 - .../questions/property_number_of_bedrooms.rb | 1 - .../form/sales/questions/purchase_price.rb | 1 - app/models/form/sales/questions/savings.rb | 4 +- .../form/sales/questions/staircase_bought.rb | 1 - .../form/sales/questions/staircase_owned.rb | 1 - app/models/form/sales/questions/value.rb | 1 - .../validations/property_validations.rb | 26 +++ .../sales/sale_information_validations.rb | 2 +- app/models/validations/shared_validations.rb | 21 --- .../imports/lettings_logs_import_service.rb | 4 +- config/forms/2021_2022.json | 8 +- config/forms/2022_2023.json | 8 +- config/locales/en.yml | 9 +- spec/fixtures/forms/2021_2022.json | 26 ++- .../questions/offered_social_let_spec.rb | 8 +- .../form/sales/questions/savings_spec.rb | 4 +- spec/models/lettings_log_spec.rb | 8 +- spec/models/sales_log_spec.rb | 4 +- .../validations/property_validations_spec.rb | 49 ++++++ .../validations/shared_validations_spec.rb | 158 ++++++------------ .../requests/lettings_logs_controller_spec.rb | 2 +- .../lettings_logs_import_service_spec.rb | 4 +- 39 files changed, 174 insertions(+), 200 deletions(-) diff --git a/app/models/form/lettings/questions/beds.rb b/app/models/form/lettings/questions/beds.rb index 6fa6c7c2b..75d2a835d 100644 --- a/app/models/form/lettings/questions/beds.rb +++ b/app/models/form/lettings/questions/beds.rb @@ -7,8 +7,8 @@ class Form::Lettings::Questions::Beds < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 12 - @min = 1 + @max = 150 + @min = 0 @hint_text = "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom." @step = 1 @question_number = 22 diff --git a/app/models/form/lettings/questions/offered.rb b/app/models/form/lettings/questions/offered.rb index 2c9828d31..e41def301 100644 --- a/app/models/form/lettings/questions/offered.rb +++ b/app/models/form/lettings/questions/offered.rb @@ -7,7 +7,7 @@ class Form::Lettings::Questions::Offered < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 20 + @max = 150 @min = 0 @hint_text = I18n.t("hints.offered") @step = 1 diff --git a/app/models/form/lettings/questions/offered_social_let.rb b/app/models/form/lettings/questions/offered_social_let.rb index dd57acbfe..d3ac29516 100644 --- a/app/models/form/lettings/questions/offered_social_let.rb +++ b/app/models/form/lettings/questions/offered_social_let.rb @@ -7,7 +7,7 @@ class Form::Lettings::Questions::OfferedSocialLet < ::Form::Question @type = "numeric" @width = 2 @check_answers_card_number = 0 - @max = 20 + @max = 150 @min = 0 @hint_text = I18n.t("hints.offered") @step = 1 diff --git a/app/models/form/sales/questions/age1.rb b/app/models/form/sales/questions/age1.rb index 0ae3bf682..d32083b53 100644 --- a/app/models/form/sales/questions/age1.rb +++ b/app/models/form/sales/questions/age1.rb @@ -19,7 +19,6 @@ class Form::Sales::Questions::Age1 < ::Form::Question @check_answers_card_number = 1 @min = 16 @max = 110 - @step = 1 @question_number = 20 end end diff --git a/app/models/form/sales/questions/age2.rb b/app/models/form/sales/questions/age2.rb index c003eb02e..c0dc567a1 100644 --- a/app/models/form/sales/questions/age2.rb +++ b/app/models/form/sales/questions/age2.rb @@ -13,7 +13,6 @@ class Form::Sales::Questions::Age2 < ::Form::Question @check_answers_card_number = 2 @max = 110 @min = 0 - @step = 1 @question_number = 28 end end diff --git a/app/models/form/sales/questions/deposit_amount.rb b/app/models/form/sales/questions/deposit_amount.rb index 784bb56a1..fb6c0e563 100644 --- a/app/models/form/sales/questions/deposit_amount.rb +++ b/app/models/form/sales/questions/deposit_amount.rb @@ -6,9 +6,8 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question @header = "How much cash deposit was paid on the property?" @type = "numeric" @min = 0 - @max = 999_999 - @step = 1 @width = 5 + @max = 999_999 @prefix = "£" @hint_text = "Enter the total cash sum paid by the buyer towards the property that was not funded by the mortgage" @derived = true diff --git a/app/models/form/sales/questions/deposit_discount.rb b/app/models/form/sales/questions/deposit_discount.rb index ae6521392..577da5a91 100644 --- a/app/models/form/sales/questions/deposit_discount.rb +++ b/app/models/form/sales/questions/deposit_discount.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::DepositDiscount < ::Form::Question @type = "numeric" @min = 0 @max = 999_999 - @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the total cash discount given on the property being purchased through the Social HomeBuy scheme" diff --git a/app/models/form/sales/questions/discount.rb b/app/models/form/sales/questions/discount.rb index ee39b8916..8c5cf7132 100644 --- a/app/models/form/sales/questions/discount.rb +++ b/app/models/form/sales/questions/discount.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::Discount < ::Form::Question @type = "numeric" @min = 0 @max = 100 - @step = 1 @width = 5 @suffix = "%" @hint_text = "For Right to Buy (RTB), Preserved Right to Buy (PRTB), and Voluntary Right to Buy (VRTB)

diff --git a/app/models/form/sales/questions/equity.rb b/app/models/form/sales/questions/equity.rb index 4db09a31f..0119fea69 100644 --- a/app/models/form/sales/questions/equity.rb +++ b/app/models/form/sales/questions/equity.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::Equity < ::Form::Question @type = "numeric" @min = 0 @max = 100 - @step = 1 @width = 5 @suffix = "%" @hint_text = "Enter the amount of initial equity held by the purchaser (for example, 25% or 50%)" diff --git a/app/models/form/sales/questions/grant.rb b/app/models/form/sales/questions/grant.rb index e113be536..9b0fd3091 100644 --- a/app/models/form/sales/questions/grant.rb +++ b/app/models/form/sales/questions/grant.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::Grant < ::Form::Question @type = "numeric" @min = 0 @max = 999_999 - @step = 1 @width = 5 @prefix = "£" @hint_text = "For all schemes except Right to Buy (RTB), Preserved Right to Buy (PRTB), Voluntary Right to Buy (VRTB) and Rent to Buy" diff --git a/app/models/form/sales/questions/leasehold_charges.rb b/app/models/form/sales/questions/leasehold_charges.rb index 2b2afb3e4..22ed7246e 100644 --- a/app/models/form/sales/questions/leasehold_charges.rb +++ b/app/models/form/sales/questions/leasehold_charges.rb @@ -6,7 +6,6 @@ class Form::Sales::Questions::LeaseholdCharges < ::Form::Question @header = "Enter the total monthly charge" @type = "numeric" @min = 1 - @step = 0.01 @width = 5 @prefix = "£" @ownershipsch = ownershipsch diff --git a/app/models/form/sales/questions/monthly_rent.rb b/app/models/form/sales/questions/monthly_rent.rb index 75c4a7ce5..2a28bc691 100644 --- a/app/models/form/sales/questions/monthly_rent.rb +++ b/app/models/form/sales/questions/monthly_rent.rb @@ -6,7 +6,6 @@ class Form::Sales::Questions::MonthlyRent < ::Form::Question @header = "What is the basic monthly rent?" @type = "numeric" @min = 0 - @step = 0.01 @width = 5 @prefix = "£" @hint_text = "Amount paid before any charges" diff --git a/app/models/form/sales/questions/mortgage_amount.rb b/app/models/form/sales/questions/mortgage_amount.rb index ce4b548e1..9b199b2aa 100644 --- a/app/models/form/sales/questions/mortgage_amount.rb +++ b/app/models/form/sales/questions/mortgage_amount.rb @@ -6,7 +6,6 @@ class Form::Sales::Questions::MortgageAmount < ::Form::Question @header = "What is the mortgage amount?" @type = "numeric" @min = 1 - @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the amount of mortgage agreed with the mortgage lender. Exclude any deposits or cash payments. Numeric in pounds. Rounded to the nearest pound." diff --git a/app/models/form/sales/questions/mortgage_length.rb b/app/models/form/sales/questions/mortgage_length.rb index 218ea03a1..adaa94d01 100644 --- a/app/models/form/sales/questions/mortgage_length.rb +++ b/app/models/form/sales/questions/mortgage_length.rb @@ -7,7 +7,6 @@ class Form::Sales::Questions::MortgageLength < ::Form::Question @type = "numeric" @min = 0 @max = 60 - @step = 1 @width = 5 @suffix = " years" @hint_text = "You should round up to the nearest year. Value should not exceed 60 years." diff --git a/app/models/form/sales/questions/number_of_others_in_property.rb b/app/models/form/sales/questions/number_of_others_in_property.rb index 450b12eb0..556ddf837 100644 --- a/app/models/form/sales/questions/number_of_others_in_property.rb +++ b/app/models/form/sales/questions/number_of_others_in_property.rb @@ -9,7 +9,6 @@ class Form::Sales::Questions::NumberOfOthersInProperty < ::Form::Question @width = 2 @min = 0 @max = 15 - @step = 1 @question_number = 35 end diff --git a/app/models/form/sales/questions/person_age.rb b/app/models/form/sales/questions/person_age.rb index cdbc9f80b..779e09669 100644 --- a/app/models/form/sales/questions/person_age.rb +++ b/app/models/form/sales/questions/person_age.rb @@ -12,7 +12,6 @@ class Form::Sales::Questions::PersonAge < ::Form::Question @check_answers_card_number = person_index @min = 0 @max = 110 - @step = 1 @question_number = 29 + (4 * person_index) end end diff --git a/app/models/form/sales/questions/previous_bedrooms.rb b/app/models/form/sales/questions/previous_bedrooms.rb index 8f36a8485..d9f9aaddb 100644 --- a/app/models/form/sales/questions/previous_bedrooms.rb +++ b/app/models/form/sales/questions/previous_bedrooms.rb @@ -8,7 +8,6 @@ class Form::Sales::Questions::PreviousBedrooms < ::Form::Question @width = 5 @min = 1 @max = 6 - @step = 1 @hint_text = "For bedsits enter 1" @question_number = 85 end diff --git a/app/models/form/sales/questions/property_number_of_bedrooms.rb b/app/models/form/sales/questions/property_number_of_bedrooms.rb index b37253244..9dbdbf3e8 100644 --- a/app/models/form/sales/questions/property_number_of_bedrooms.rb +++ b/app/models/form/sales/questions/property_number_of_bedrooms.rb @@ -9,7 +9,6 @@ class Form::Sales::Questions::PropertyNumberOfBedrooms < ::Form::Question @width = 10 @min = 1 @max = 9 - @step = 1 @question_number = 11 end end diff --git a/app/models/form/sales/questions/purchase_price.rb b/app/models/form/sales/questions/purchase_price.rb index f88938777..c98a39ef3 100644 --- a/app/models/form/sales/questions/purchase_price.rb +++ b/app/models/form/sales/questions/purchase_price.rb @@ -6,7 +6,6 @@ class Form::Sales::Questions::PurchasePrice < ::Form::Question @header = "What is the full purchase price?" @type = "numeric" @min = 0 - @step = 0.01 @width = 5 @prefix = "£" @hint_text = "For all schemes, including Right to Acquire (RTA), Right to Buy (RTB), Voluntary Right to Buy (VRTB) or Preserved Right to Buy (PRTB) sales, enter the full price of the property without any discount" diff --git a/app/models/form/sales/questions/savings.rb b/app/models/form/sales/questions/savings.rb index 6c01ed2fd..086a0ec8d 100644 --- a/app/models/form/sales/questions/savings.rb +++ b/app/models/form/sales/questions/savings.rb @@ -2,12 +2,12 @@ class Form::Sales::Questions::Savings < ::Form::Question def initialize(id, hsh, page) super @id = "savings" - @check_answer_label = "Buyer’s total savings before any deposit paid" + @check_answer_label = "Buyer’s total savings (to nearest £10) before any deposit paid" @header = "Enter their total savings to the nearest £10" @type = "numeric" @width = 5 @prefix = "£" - @step = 10 + @step = 1 @min = 0 @question_number = 72 end diff --git a/app/models/form/sales/questions/staircase_bought.rb b/app/models/form/sales/questions/staircase_bought.rb index dfdb273f5..9e54e92d3 100644 --- a/app/models/form/sales/questions/staircase_bought.rb +++ b/app/models/form/sales/questions/staircase_bought.rb @@ -8,7 +8,6 @@ class Form::Sales::Questions::StaircaseBought < ::Form::Question @width = 5 @min = 0 @max = 100 - @step = 1 @suffix = "%" @question_number = 77 end diff --git a/app/models/form/sales/questions/staircase_owned.rb b/app/models/form/sales/questions/staircase_owned.rb index 2b4d89861..b8d5a65ec 100644 --- a/app/models/form/sales/questions/staircase_owned.rb +++ b/app/models/form/sales/questions/staircase_owned.rb @@ -8,7 +8,6 @@ class Form::Sales::Questions::StaircaseOwned < ::Form::Question @width = 5 @min = 0 @max = 100 - @step = 1 @suffix = "%" @question_number = 78 end diff --git a/app/models/form/sales/questions/value.rb b/app/models/form/sales/questions/value.rb index d349a99df..4736f37af 100644 --- a/app/models/form/sales/questions/value.rb +++ b/app/models/form/sales/questions/value.rb @@ -6,7 +6,6 @@ class Form::Sales::Questions::Value < ::Form::Question @header = "What was the full purchase price?" @type = "numeric" @min = 0 - @step = 1 @width = 5 @prefix = "£" @hint_text = "Enter the full purchase price of the property before any discounts are applied. For shared ownership, enter the full purchase price paid for 100% equity (this is equal to the value of the share owned by the PRP plus the value bought by the purchaser)" diff --git a/app/models/validations/property_validations.rb b/app/models/validations/property_validations.rb index e9680facf..d2b6d2a0b 100644 --- a/app/models/validations/property_validations.rb +++ b/app/models/validations/property_validations.rb @@ -2,6 +2,24 @@ module Validations::PropertyValidations # Validations methods need to be called 'validate_' to run on model save # or 'validate_' to run on submit as well + def validate_property_number_of_times_relet(record) + return unless record.offered + + # Since offered is an integer type ActiveRecord will automatically cast that for us + # but it's type casting is a little lax so "random" becomes 0. To make sure that doesn't pass + # validation and then get silently dropped we attempt strict type casting on the original value + # as part of our validation. + begin + Integer(record.offered_before_type_cast) + rescue ArgumentError + record.errors.add :offered, I18n.t("validations.property.offered.relet_number") + end + + if record.offered.negative? || record.offered > 20 + record.errors.add :offered, :over_20, message: I18n.t("validations.property.offered.relet_number") + end + end + REFERRAL_INVALID_TMP = [8, 10, 12, 13, 14, 15].freeze def validate_rsnvac(record) if !record.first_time_property_let_as_social_housing? && record.has_first_let_vacancy_reason? @@ -33,6 +51,10 @@ module Validations::PropertyValidations end def validate_shared_housing_rooms(record) + if record.beds.present? && record.beds <= 0 + record.errors.add :beds, I18n.t("validations.property.beds.non_positive") + end + unless record.unittype_gn.nil? if record.is_bedsit? && record.beds != 1 && record.beds.present? record.errors.add :unittype_gn, I18n.t("validations.property.unittype_gn.one_bedroom_bedsit") @@ -48,6 +70,10 @@ module Validations::PropertyValidations record.errors.add :beds, I18n.t("validations.property.unittype_gn.one_seven_bedroom_shared") end end + + if record.beds.present? && record.beds > 12 + record.errors.add :beds, :over_max, message: I18n.t("validations.property.beds.over_max") + end end def validate_uprn(record) diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index bf3c2af86..42dbde2a5 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -12,7 +12,7 @@ module Validations::Sales::SaleInformationValidations end def validate_years_living_in_property_before_purchase(record) - return unless record.proplen&.nonzero? + return unless record.proplen && record.proplen.nonzero? case record.type when 18 diff --git a/app/models/validations/shared_validations.rb b/app/models/validations/shared_validations.rb index 6a32563a7..f032a089c 100644 --- a/app/models/validations/shared_validations.rb +++ b/app/models/validations/shared_validations.rb @@ -35,27 +35,6 @@ module Validations::SharedValidations end end - def validate_numeric_step(record) - record.form.numeric_questions.each do |question| - next unless question.step - next unless record[question.id] && question.page.routed_to?(record, nil) - - value = record.public_send("#{question.id}_before_type_cast") - field = question.check_answer_label || question.id - incorrect_accuracy = (value.to_d * 100) % (question.step * 100) != 0 - - if question.step < 1 && incorrect_accuracy - record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_hundredth", field:) - elsif incorrect_accuracy || value.to_d != value.to_i # if the user enters a value in exponent notation (eg '4e1') the to_i method does not convert this to the correct value - field = question.check_answer_label || question.id - case question.step - when 1 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.whole_number", field:) - when 10 then record.errors.add question.id.to_sym, I18n.t("validations.numeric.nearest_ten", field:) - end - end - end - end - def validate_property_postcode(record) postcode = record.postcode_full if record.postcode_known? && (postcode.blank? || !postcode.match(POSTCODE_REGEXP)) diff --git a/app/services/imports/lettings_logs_import_service.rb b/app/services/imports/lettings_logs_import_service.rb index 56fb0c0d2..01c71faef 100644 --- a/app/services/imports/lettings_logs_import_service.rb +++ b/app/services/imports/lettings_logs_import_service.rb @@ -290,10 +290,10 @@ module Imports %i[prevten over_20_foster_care] => %w[prevten age1], %i[prevten non_temp_accommodation] => %w[prevten rsnvac], %i[joint not_joint_tenancy] => %w[joint], - %i[offered outside_the_range] => %w[offered], + %i[offered over_20] => %w[offered], %i[earnings over_hard_max] => %w[ecstat1], %i[tshortfall no_outstanding_charges] => %w[tshortfall hbrentshortfall], - %i[beds outside_the_range] => %w[beds], + %i[beds over_max] => %w[beds], %i[tcharge complete_1_of_3] => %w[brent scharge pscharge supcharg tcharge], %i[scharge under_min] => %w[brent scharge pscharge supcharg tcharge], %i[tshortfall must_be_positive] => %w[tshortfall tshortfall_known], diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json index cf8ac4cd9..741195f01 100644 --- a/config/forms/2021_2022.json +++ b/config/forms/2021_2022.json @@ -566,7 +566,7 @@ "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 20, + "max": 150, "step": 1, "width": 2 } @@ -588,7 +588,7 @@ "hint_text": "If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 20, + "max": 150, "step": 1, "width": 2 } @@ -702,8 +702,8 @@ "header": "How many bedrooms does the property have?", "hint_text": "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom.", "type": "numeric", - "min": 1, - "max": 12, + "min": 0, + "max": 150, "step": 1, "width": 2 } diff --git a/config/forms/2022_2023.json b/config/forms/2022_2023.json index 181d8a19c..9b5aa6bb8 100644 --- a/config/forms/2022_2023.json +++ b/config/forms/2022_2023.json @@ -561,7 +561,7 @@ "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 20, + "max": 150, "step": 1, "width": 2 } @@ -583,7 +583,7 @@ "hint_text": "If the property is being offered for let for the first time, enter 0.", "type": "numeric", "min": 0, - "max": 20, + "max": 150, "step": 1, "width": 2 } @@ -697,8 +697,8 @@ "header": "How many bedrooms does the property have?", "hint_text": "If shared accommodation, enter the number of bedrooms occupied by this household. A bedsit has 1 bedroom.", "type": "numeric", - "min": 1, - "max": 12, + "min": 0, + "max": 150, "step": 1, "width": 2 } diff --git a/config/locales/en.yml b/config/locales/en.yml index 7b65a8cb2..eef342674 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -144,11 +144,6 @@ en: numeric: within_range: "%{field} must be between %{min} and %{max}" above_min: "%{field} must be at least %{min}" - whole_number: "%{field} must be a whole number" - nearest_ten: "%{field} must be given to the nearest ten" - nearest_hundredth: "%{field} must be given to the nearest hundredth" - normal_format: "Enter a number" - date: invalid_date: "Enter a date in the correct format, for example 31 1 2022" outside_collection_window: Enter a date within the 22/23 collection year, which is between 1st April 2022 and 31st March 2023 @@ -218,6 +213,8 @@ en: ten_years_before_tenancy_start: "Enter a void date no more than 10 years before the tenancy start date" before_tenancy_start: "Enter a void date that is before the tenancy start date" after_mrcdate: "Void date must be before the major repairs date if provided" + offered: + relet_number: "Enter a number between 0 and 20 for the amount of times the property has been re-let" la: la_invalid_for_org: "%{org_name} does not operate in %{la_name}" postcode_invalid_for_org: "Enter a postcode in an area covered by %{org_name}" @@ -233,6 +230,8 @@ en: one_seven_bedroom_shared: "A shared house must have 1 to 7 bedrooms" one_three_bedroom_single_tenant_shared: "A shared house with fewer than two tenants must have 1 to 3 bedrooms" beds: + non_positive: "Number of bedrooms has to be greater than 0" + over_max: "Number of bedrooms cannot be more than 12" bedsits_have_max_one_bedroom: "Number of bedrooms must be 1 if the property is a bedsit" proptype: bedsits_have_max_one_bedroom: "Answer cannot be 'Bedsit' if the property has 2 or more bedrooms" diff --git a/spec/fixtures/forms/2021_2022.json b/spec/fixtures/forms/2021_2022.json index d25b575cc..97999d8a3 100644 --- a/spec/fixtures/forms/2021_2022.json +++ b/spec/fixtures/forms/2021_2022.json @@ -908,7 +908,7 @@ "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "step": 0.01, + "step": 1, "width": 4, "fields-to-add": [ "brent", @@ -924,7 +924,7 @@ "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "step": 0.01, + "step": 1, "width": 4, "fields-to-add": [ "brent", @@ -940,7 +940,7 @@ "hint_text": "Not eligible for housing benefit or Universal Credit. For example, hot water excluding water rates.", "type": "numeric", "min": 0, - "step": 0.01, + "step": 1, "width": 4, "fields-to-add": [ "brent", @@ -957,7 +957,7 @@ "type": "numeric", "min": 0, "max": 300, - "step": 0.01, + "step": 1, "width": 4, "fields-to-add": [ "brent", @@ -973,7 +973,7 @@ "hint_text": "This is the total of rent and all charges", "type": "numeric_output", "min": 0, - "step": 0.01, + "step": 1, "width": 4, "readonly": true, "requires_js": true @@ -990,7 +990,7 @@ "hint_text": "", "type": "numeric", "min": 0, - "step": 1, + "step": "1", "width": 5, "prefix": "£", "suffix": " every week" @@ -1000,12 +1000,11 @@ "care_home_charge": { "questions": { "offered": { - "check_answer_label": "Times previously offered since becoming available", - "header": "Since becoming available for re-let, how many times has the property been previously offered?", - "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", + "check_answer_label": "Basic Rent", + "header": "What is the basic rent?", + "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "max": 20, "step": 1, "width": 4 } @@ -1019,12 +1018,11 @@ "care_home_charge_bi_weekly": { "questions": { "offered": { - "check_answer_label": "Times previously offered since becoming available", - "header": "Since becoming available for re-let, how many times has the property been previously offered?", - "hint_text": "This is after the last tenancy ended. If the property is being offered for let for the first time, enter 0.", + "check_answer_label": "Basic Rent", + "header": "What is the basic rent?", + "hint_text": "Eligible for housing benefit or Universal Credit", "type": "numeric", "min": 0, - "max": 20, "step": 1, "width": 4 } diff --git a/spec/models/form/lettings/questions/offered_social_let_spec.rb b/spec/models/form/lettings/questions/offered_social_let_spec.rb index ac1930495..6516c661b 100644 --- a/spec/models/form/lettings/questions/offered_social_let_spec.rb +++ b/spec/models/form/lettings/questions/offered_social_let_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Form::Lettings::Questions::OfferedSocialLet, type: :model do let(:page) { instance_double(Form::Page) } it "has correct page" do - expect(question.page).to be page + expect(question.page).to eq page end it "has the correct id" do @@ -26,12 +26,12 @@ RSpec.describe Form::Lettings::Questions::OfferedSocialLet, type: :model do end it "has the correct minimum and maximum values" do - expect(question.min).to be 0 - expect(question.max).to be 20 + expect(question.min).to eq 0 + expect(question.max).to eq 150 end it "has the correct step" do - expect(question.step).to be 1 + expect(question.step).to eq 1 end it "is not marked as derived" do diff --git a/spec/models/form/sales/questions/savings_spec.rb b/spec/models/form/sales/questions/savings_spec.rb index 8e9c4daa4..3f721d7ef 100644 --- a/spec/models/form/sales/questions/savings_spec.rb +++ b/spec/models/form/sales/questions/savings_spec.rb @@ -20,7 +20,7 @@ RSpec.describe Form::Sales::Questions::Savings, type: :model do end it "has the correct check_answer_label" do - expect(question.check_answer_label).to eq("Buyer’s total savings before any deposit paid") + expect(question.check_answer_label).to eq("Buyer’s total savings (to nearest £10) before any deposit paid") end it "has the correct type" do @@ -40,7 +40,7 @@ RSpec.describe Form::Sales::Questions::Savings, type: :model do end it "has correct step" do - expect(question.step).to be 10 + expect(question.step).to eq(1) end it "has correct prefix" do diff --git a/spec/models/lettings_log_spec.rb b/spec/models/lettings_log_spec.rb index 481f7fbbe..fb0f01be2 100644 --- a/spec/models/lettings_log_spec.rb +++ b/spec/models/lettings_log_spec.rb @@ -112,6 +112,10 @@ RSpec.describe LettingsLog do expect(validator).to receive(:validate_shared_housing_rooms) end + it "validates number of times the property has been relet" do + expect(validator).to receive(:validate_property_number_of_times_relet) + end + it "validates tenancy type" do expect(validator).to receive(:validate_fixed_term_tenancy) expect(validator).to receive(:validate_other_tenancy_type) @@ -3100,11 +3104,11 @@ RSpec.describe LettingsLog do end context "when a non setup field is invalid" do - subject(:model) { build(:lettings_log, :completed, offered: 234) } + subject(:model) { described_class.new(beds: 404) } it "blanks it" do model.valid? - expect { model.blank_invalid_non_setup_fields! }.to change(model, :offered) + expect { model.blank_invalid_non_setup_fields! }.to change(model, :beds) end end end diff --git a/spec/models/sales_log_spec.rb b/spec/models/sales_log_spec.rb index 1fc2cf73e..c008269ea 100644 --- a/spec/models/sales_log_spec.rb +++ b/spec/models/sales_log_spec.rb @@ -509,9 +509,9 @@ RSpec.describe SalesLog, type: :model do let(:completed_sales_log) { create(:sales_log, :completed) } it "returns small numbers correctly formatted as currency" do - completed_sales_log.update!(savings: 20) + completed_sales_log.update!(savings: 4) - expect(completed_sales_log.field_formatted_as_currency("savings")).to eq("£20.00") + expect(completed_sales_log.field_formatted_as_currency("savings")).to eq("£4.00") end it "returns quite large numbers correctly formatted as currency" do diff --git a/spec/models/validations/property_validations_spec.rb b/spec/models/validations/property_validations_spec.rb index e918e3405..3b3e42e9e 100644 --- a/spec/models/validations/property_validations_spec.rb +++ b/spec/models/validations/property_validations_spec.rb @@ -6,6 +6,39 @@ RSpec.describe Validations::PropertyValidations do let(:property_validator_class) { Class.new { include Validations::PropertyValidations } } let(:record) { FactoryBot.create(:lettings_log) } + describe "#validate_property_number_of_times_relet" do + let(:expected_error) { I18n.t("validations.property.offered.relet_number") } + + it "does not add an error if the record offered is missing" do + record.offered = nil + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).to be_empty + end + + it "does not add an error if offered is valid (number between 0 and 20)" do + record.offered = 0 + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).to be_empty + record.offered = 10 + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).to be_empty + record.offered = 20 + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).to be_empty + end + + it "does add an error when offered is invalid" do + record.offered = "invalid" + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).not_to be_empty + expect(record.errors["offered"]).to include(match(expected_error)) + record.offered = 21 + property_validator.validate_property_number_of_times_relet(record) + expect(record.errors).not_to be_empty + expect(record.errors["offered"]).to include(match(expected_error)) + end + end + describe "#validate_shared_housing_rooms" do context "when number of bedrooms has not been answered" do it "does not add an error" do @@ -96,6 +129,22 @@ RSpec.describe Validations::PropertyValidations do expect(record.errors["beds"]).to include(I18n.t("validations.property.unittype_gn.one_three_bedroom_single_tenant_shared")) end end + + context "when a negative number of bedrooms is entered" do + it "adds an error" do + record.beds = -4 + property_validator.validate_shared_housing_rooms(record) + expect(record.errors["beds"]).to include(I18n.t("validations.property.beds.non_positive")) + end + end + + context "when a room number higher than 12 has been entered" do + it "adds an error" do + record.beds = 13 + property_validator.validate_shared_housing_rooms(record) + expect(record.errors["beds"]).to include(I18n.t("validations.property.beds.over_max")) + end + end end describe "#validate_unitletas" do diff --git a/spec/models/validations/shared_validations_spec.rb b/spec/models/validations/shared_validations_spec.rb index fe3612c3c..8f5038c5d 100644 --- a/spec/models/validations/shared_validations_spec.rb +++ b/spec/models/validations/shared_validations_spec.rb @@ -4,8 +4,8 @@ RSpec.describe Validations::SharedValidations do subject(:shared_validator) { validator_class.new } let(:validator_class) { Class.new { include Validations::SharedValidations } } - let(:lettings_log) { FactoryBot.create(:lettings_log) } - let(:sales_log) { FactoryBot.create(:sales_log, :completed) } + let(:record) { FactoryBot.create(:lettings_log) } + let(:sales_record) { FactoryBot.create(:sales_log, :completed) } let(:fake_2021_2022_form) { Form.new("spec/fixtures/forms/2021_2022.json") } describe "numeric min max validations" do @@ -15,164 +15,102 @@ RSpec.describe Validations::SharedValidations do context "when validating age" do it "validates that person 1's age is a number" do - lettings_log.age1 = "random" - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age1"]) + record.age1 = "random" + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are a number" do - lettings_log.age2 = "random" - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age2"]) + record.age2 = "random" + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is greater than 16" do - lettings_log.age1 = 15 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age1"]) + record.age1 = 15 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are greater than 1" do - lettings_log.age2 = 0 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age2"]) + record.age2 = 0 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is less than 121" do - lettings_log.age1 = 121 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age1"]) + record.age1 = 121 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)) end it "validates that other household member ages are greater than 121" do - lettings_log.age2 = 123 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age2"]) + record.age2 = 123 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age2"]) .to include(match I18n.t("validations.numeric.within_range", field: "Person 2’s age", min: 1, max: 120)) end it "validates that person 1's age is between 16 and 120" do - lettings_log.age1 = 63 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age1"]).to be_empty + record.age1 = 63 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age1"]).to be_empty end it "validates that other household member ages are between 1 and 120" do - lettings_log.age6 = 45 - shared_validator.validate_numeric_min_max(lettings_log) - expect(lettings_log.errors["age6"]).to be_empty + record.age6 = 45 + shared_validator.validate_numeric_min_max(record) + expect(record.errors["age6"]).to be_empty end context "with sales log" do it "validates that person 2's age is between 0 and 110 for non joint purchase" do - sales_log.jointpur = 2 - sales_log.hholdcount = 1 - sales_log.details_known_2 = 1 - sales_log.age2 = 130 - shared_validator.validate_numeric_min_max(sales_log) - expect(sales_log.errors["age2"].first).to eq("Person 2’s age must be between 0 and 110") + sales_record.jointpur = 2 + sales_record.hholdcount = 1 + sales_record.details_known_2 = 1 + sales_record.age2 = 130 + shared_validator.validate_numeric_min_max(sales_record) + expect(sales_record.errors["age2"].first).to eq("Person 2’s age must be between 0 and 110") end it "validates that buyer 2's age is between 0 and 110 for joint purchase" do - sales_log.jointpur = 1 - sales_log.age2 = 130 - shared_validator.validate_numeric_min_max(sales_log) - expect(sales_log.errors["age2"].first).to eq("Buyer 2’s age must be between 0 and 110") + sales_record.jointpur = 1 + sales_record.age2 = 130 + shared_validator.validate_numeric_min_max(sales_record) + expect(sales_record.errors["age2"].first).to eq("Buyer 2’s age must be between 0 and 110") end end end it "adds the correct validation text when a question has a min but not a max" do - sales_log.savings = -10 - shared_validator.validate_numeric_min_max(sales_log) - expect(sales_log.errors["savings"]).to include(match I18n.t("validations.numeric.above_min", field: "Buyer’s total savings before any deposit paid", min: "£0")) + sales_record.savings = -10 + shared_validator.validate_numeric_min_max(sales_record) + expect(sales_record.errors["savings"]).to include(match I18n.t("validations.numeric.above_min", field: "Buyer’s total savings (to nearest £10) before any deposit paid", min: "£0")) end context "when validating percent" do it "validates that suffixes are added in the error message" do - sales_log.ownershipsch = 1 - sales_log.staircase = 1 - sales_log.stairbought = 150 - shared_validator.validate_numeric_min_max(sales_log) - expect(sales_log.errors["stairbought"]) + sales_record.ownershipsch = 1 + sales_record.staircase = 1 + sales_record.stairbought = 150 + shared_validator.validate_numeric_min_max(sales_record) + expect(sales_record.errors["stairbought"]) .to include(match I18n.t("validations.numeric.within_range", field: "Percentage bought in this staircasing transaction", min: "0%", max: "100%")) end end context "when validating price" do - it "validates that prefix £ and delimeter ',' is added in the error message" do - sales_log.income1 = -5 - shared_validator.validate_numeric_min_max(sales_log) - expect(sales_log.errors["income1"]) + it "validates that £ prefix and , is added in the error message" do + sales_record.income1 = -5 + shared_validator.validate_numeric_min_max(sales_record) + expect(sales_record.errors["income1"]) .to include(match I18n.t("validations.numeric.within_range", field: "Buyer 1’s gross annual income", min: "£0", max: "£999,999")) end end end - - describe "validating level of accuracy or rounding for numeric questions" do - context "when validating a question with a step of 1" do - it "adds an error if input is a decimal" do - sales_log.income1 = 30_000.5 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income") - end - - it "adds an error if the user attempts to input a number in exponent format" do - sales_log.income1 = "3e5" - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors[:income1]).to include I18n.t("validations.numeric.whole_number", field: "Buyer 1’s gross annual income") - end - - it "does not add an error if input is an integer" do - sales_log.income1 = 30_000 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors).to be_empty - end - end - - context "when validating a question with a step of 10" do - it "adds an error if input is not a multiple of ten" do - sales_log.savings = 30_005 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings before any deposit paid") - end - - it "adds an error if the user attempts to input a number in exponent format" do - sales_log.savings = "3e5" - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors[:savings]).to include I18n.t("validations.numeric.nearest_ten", field: "Buyer’s total savings before any deposit paid") - end - - it "does not add an error if input is a multiple of ten" do - sales_log.savings = 30_000 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors).to be_empty - end - end - - context "when validating a question with a step of 0.01" do - it "adds an error if input has more than 2 decimal places" do - sales_log.mscharge = 30.7418 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors[:mscharge]).to include I18n.t("validations.numeric.nearest_hundredth", field: "Monthly leasehold charges") - end - - it "does not add an error if the user attempts to input a number in exponent format" do - sales_log.mscharge = "3e1" - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors).to be_empty - end - - it "does not add an error if input has 2 or fewer decimal places" do - sales_log.mscharge = 30.74 - shared_validator.validate_numeric_step(sales_log) - expect(sales_log.errors).to be_empty - end - end - end end diff --git a/spec/requests/lettings_logs_controller_spec.rb b/spec/requests/lettings_logs_controller_spec.rb index 6de5c4db2..d95e0a3fd 100644 --- a/spec/requests/lettings_logs_controller_spec.rb +++ b/spec/requests/lettings_logs_controller_spec.rb @@ -82,7 +82,7 @@ RSpec.describe LettingsLogsController, type: :request do it "validates lettings log parameters" do json_response = JSON.parse(response.body) expect(response).to have_http_status(:unprocessable_entity) - expect(json_response["errors"]).to match_array([["offered", [I18n.t("validations.numeric.within_range", field: "Times previously offered since becoming available", min: 0, max: 20)]], ["age1", [I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)]]]) + expect(json_response["errors"]).to match_array([["offered", [I18n.t("validations.property.offered.relet_number")]], ["age1", [I18n.t("validations.numeric.within_range", field: "Lead tenant’s age", min: 16, max: 120)]]]) end end diff --git a/spec/services/imports/lettings_logs_import_service_spec.rb b/spec/services/imports/lettings_logs_import_service_spec.rb index 11a25ff22..4621afb2f 100644 --- a/spec/services/imports/lettings_logs_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_import_service_spec.rb @@ -434,7 +434,7 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with(/Removing offered with error: Times previously offered since becoming available must be between 0 and 20/) + expect(logger).to receive(:warn).with(/Removing offered with error: Enter a number between 0 and 20 for the amount of times the property has been re-let/) expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end @@ -530,7 +530,7 @@ RSpec.describe Imports::LettingsLogsImportService do end it "intercepts the relevant validation error" do - expect(logger).to receive(:warn).with(/Removing beds with error: Number of bedrooms must be between 1 and 12/) + expect(logger).to receive(:warn).with(/Removing beds with error: Number of bedrooms cannot be more than 12/) expect { lettings_log_service.send(:create_log, lettings_log_xml) } .not_to raise_error end From 53f024899bb8c0309a05104304ef359e96b29772 Mon Sep 17 00:00:00 2001 From: James Rose Date: Tue, 18 Apr 2023 09:31:02 +0100 Subject: [PATCH 26/27] Add `reset_password_token` to sensitive parameters list (#1556) --- config/initializers/filter_parameter_logging.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/initializers/filter_parameter_logging.rb b/config/initializers/filter_parameter_logging.rb index 71d184ad6..928c8f671 100644 --- a/config/initializers/filter_parameter_logging.rb +++ b/config/initializers/filter_parameter_logging.rb @@ -2,5 +2,5 @@ # Configure sensitive parameters which will be filtered from the log file. Rails.application.config.filter_parameters += %i[ - passw secret token crypt salt certificate otp ssn + passw secret token crypt salt certificate otp ssn reset_password_token ] From 3029f51427de3fede2214c440bb5fe13f4e79834 Mon Sep 17 00:00:00 2001 From: Phil Lee Date: Tue, 18 Apr 2023 10:41:16 +0100 Subject: [PATCH 27/27] CLDC-2279 Bulk upload split feature toggle by log type (#1552) # Context - https://digital.dclg.gov.uk/jira/browse/CLDC-2279 # Changes - split bulk upload feature toggle by log type ie lettings and sales - this allows us to toggle with finer granularity - moved `FeatureToggle` from initializer to service class. not sure why it was an initializer in the first place? this means its available to zeitwerk and will be reloaded when needed --- {config/initializers => app/services}/feature_toggle.rb | 6 +++++- app/views/logs/index.html.erb | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) rename {config/initializers => app/services}/feature_toggle.rb (91%) diff --git a/config/initializers/feature_toggle.rb b/app/services/feature_toggle.rb similarity index 91% rename from config/initializers/feature_toggle.rb rename to app/services/feature_toggle.rb index 9986af543..eed6244d1 100644 --- a/config/initializers/feature_toggle.rb +++ b/app/services/feature_toggle.rb @@ -36,7 +36,11 @@ class FeatureToggle true end - def self.bulk_upload_logs? + def self.bulk_upload_lettings_logs? + !Rails.env.production? + end + + def self.bulk_upload_sales_logs? !Rails.env.production? end diff --git a/app/views/logs/index.html.erb b/app/views/logs/index.html.erb index 2d88c9bd6..04209be73 100644 --- a/app/views/logs/index.html.erb +++ b/app/views/logs/index.html.erb @@ -55,8 +55,12 @@ <%= govuk_button_to "Create a new sales log", sales_logs_path, class: "govuk-!-margin-right-6" %> <% end %> - <% if FeatureToggle.bulk_upload_logs? %> - <%= govuk_button_link_to "Upload #{log_type_for_controller(controller)} logs in bulk", bulk_upload_path_for_controller(controller, id: "start"), secondary: true %> + <% if FeatureToggle.bulk_upload_lettings_logs? && log_type_for_controller(controller) == "lettings" %> + <%= govuk_button_link_to "Upload lettings logs in bulk", bulk_upload_path_for_controller(controller, id: "start"), secondary: true %> + <% end %> + + <% if FeatureToggle.bulk_upload_sales_logs? && log_type_for_controller(controller) == "sales" %> + <%= govuk_button_link_to "Upload sales logs in bulk", bulk_upload_path_for_controller(controller, id: "start"), secondary: true %> <% end %>

<% end %>