diff --git a/app/frontend/styles/_document-list.scss b/app/frontend/styles/_document-list.scss index d3f632b27..47936a365 100644 --- a/app/frontend/styles/_document-list.scss +++ b/app/frontend/styles/_document-list.scss @@ -1,5 +1,10 @@ +.app-document-list { + margin-top: govuk-spacing(3); + margin-bottom: govuk-spacing(6); +} + .app-document-list__item { - margin-bottom: govuk-spacing(4); + margin-bottom: govuk-spacing(3); &:last-child { margin-bottom: 0; diff --git a/app/helpers/tab_nav_helper.rb b/app/helpers/tab_nav_helper.rb index 3c61c9de0..801560b91 100644 --- a/app/helpers/tab_nav_helper.rb +++ b/app/helpers/tab_nav_helper.rb @@ -8,13 +8,13 @@ module TabNavHelper def location_cell_postcode(location, link) link_text = location.postcode || "Add postcode" - [govuk_link_to(link_text, link, method: :patch), "Location #{location.name}"].join("\n") + [govuk_link_to(link_text, link, method: :patch), "Location"].join("\n") end def scheme_cell(scheme) link_text = scheme.service_name link = scheme.confirmed? ? scheme : scheme_check_answers_path(scheme) - [govuk_link_to(link_text, link), "Scheme #{scheme.primary_client_group}"].join("\n") + [govuk_link_to(link_text, link), "Scheme"].join("\n") end def org_cell(user) diff --git a/app/models/form/sales/pages/handover_date.rb b/app/models/form/sales/pages/handover_date.rb index eeeb48333..35fbe7822 100644 --- a/app/models/form/sales/pages/handover_date.rb +++ b/app/models/form/sales/pages/handover_date.rb @@ -2,9 +2,9 @@ class Form::Sales::Pages::HandoverDate < ::Form::Page def initialize(id, hsh, subsection) super @id = "handover_date" - @depends_on = [{ - "ownershipsch" => 1, - }] + @depends_on = [ + { "ownershipsch" => 1, "resale" => 2 }, + ] end def questions diff --git a/app/models/form/sales/questions/deposit_amount.rb b/app/models/form/sales/questions/deposit_amount.rb index 094f47697..05403dbab 100644 --- a/app/models/form/sales/questions/deposit_amount.rb +++ b/app/models/form/sales/questions/deposit_amount.rb @@ -7,6 +7,7 @@ class Form::Sales::Questions::DepositAmount < ::Form::Question @type = "numeric" @min = 0 @width = 5 + @max = 9_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/mortgage_amount.rb b/app/models/form/sales/questions/mortgage_amount.rb index 5ad85bd31..bd4ae5e60 100644 --- a/app/models/form/sales/questions/mortgage_amount.rb +++ b/app/models/form/sales/questions/mortgage_amount.rb @@ -8,5 +8,6 @@ class Form::Sales::Questions::MortgageAmount < ::Form::Question @min = 0 @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." end end diff --git a/app/models/organisation.rb b/app/models/organisation.rb index fa675b36c..8e68500a4 100644 --- a/app/models/organisation.rb +++ b/app/models/organisation.rb @@ -7,7 +7,6 @@ class Organisation < ApplicationRecord has_many :data_protection_confirmations has_many :organisation_rent_periods has_many :owned_schemes, class_name: "Scheme", foreign_key: "owning_organisation_id", dependent: :delete_all - has_many :managed_schemes, class_name: "Scheme", foreign_key: "managing_organisation_id" has_many :parent_organisation_relationships, foreign_key: :child_organisation_id, class_name: "OrganisationRelationship" has_many :parent_organisations, through: :parent_organisation_relationships has_many :child_organisation_relationships, foreign_key: :parent_organisation_id, class_name: "OrganisationRelationship" diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index df76ffcbf..0f660ceb0 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -1,7 +1,9 @@ class SalesLogValidator < ActiveModel::Validator include Validations::Sales::HouseholdValidations - include Validations::SharedValidations include Validations::Sales::FinancialValidations + include Validations::Sales::SaleInformationValidations + + include Validations::SharedValidations include Validations::LocalAuthorityValidations def validate(record) diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb new file mode 100644 index 000000000..4c8747f18 --- /dev/null +++ b/app/models/validations/sales/sale_information_validations.rb @@ -0,0 +1,9 @@ +module Validations::Sales::SaleInformationValidations + def validate_deposit_range(record) + return if record.deposit.blank? + + unless record.deposit >= 0 && record.deposit <= 999_999 + record.errors.add :deposit, "Cash deposit must be £0 - £999,999" + end + end +end diff --git a/app/views/layouts/_collection_resources.html.erb b/app/views/layouts/_collection_resources.html.erb index 4be268e7a..726cd1a86 100644 --- a/app/views/layouts/_collection_resources.html.erb +++ b/app/views/layouts/_collection_resources.html.erb @@ -1,16 +1,22 @@
-

Collection resources

+

Collection resources

+

For lettings starting during 1 April 2023 - 31 March 2024 and sales completing during the same period, use the 23/24 forms.

+

Lettings 23/24

+ <%= render DocumentListComponent.new(items: [ + { + name: "Lettings log for tenants (2023/24)", + href: "https://core.communities.gov.uk/public/download/guides-and-manuals/2023-24%20Lettings%20paper%20form.pdf?download-format=pdf", + metadata: "PDF, 281 KB, 8 pages", + }, + ]) %> + +

Lettings 22/23

<%= render DocumentListComponent.new(items: [ { name: "Lettings log for tenants (2022/23)", href: "https://core.communities.gov.uk/public/download/guides-and-manuals/2022-23%20Lettings%20paper%20form.pdf?download-format=pdf", metadata: "PDF, 654 KB, 4 pages", }, - { - name: "Lettings log for tenants (2021/22)", - href: "https://core.communities.gov.uk/public/download/guides-and-manuals/2021_22%20Lettings%20Log.pdf?download-format=pdf", - metadata: "PDF, 302 KB, 3 pages", - }, ]) %>
diff --git a/app/views/locations/index.html.erb b/app/views/locations/index.html.erb index 5040120d0..469768b11 100644 --- a/app/views/locations/index.html.erb +++ b/app/views/locations/index.html.erb @@ -39,6 +39,9 @@ <% row.cell(header: true, text: "Postcode", html_attributes: { scope: "col", }) %> + <% row.cell(header: true, text: "Name", html_attributes: { + scope: "col", + }) %> <% row.cell(header: true, text: "Location code", html_attributes: { scope: "col", }) %> @@ -55,6 +58,7 @@ else location.postcode.present? ? scheme_location_check_answers_path(@scheme, location, route: "locations") : scheme_location_postcode_path(@scheme, location) end), { class: "govuk-!-font-weight-bold" }, wrapper_tag: "div")) %> + <% row.cell(text: location.name) %> <% row.cell(text: location.id) %> <% row.cell(text: status_tag(location.status)) %> <% end %> diff --git a/db/seeds.rb b/db/seeds.rb index cf6895501..8dea68d80 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -110,8 +110,8 @@ unless Rails.env.test? ) User.find_or_create_by!( - name: "Provider Owns Stock", - email: "provider.nostock1@example.com", + name: "Provider No Stock", + email: "provider.nostock@example.com", organisation: standalone_no_stock, role: "data_provider", ) do |user| @@ -120,8 +120,8 @@ unless Rails.env.test? end User.find_or_create_by!( - name: "Coordinator Owns Stock", - email: "coordinator.nostock1@example.com", + name: "Coordinator No Stock", + email: "coordinator.nostock@example.com", organisation: standalone_no_stock, role: "data_coordinator", ) do |user| diff --git a/spec/features/schemes_spec.rb b/spec/features/schemes_spec.rb index c51a5eea5..fefa3ea56 100644 --- a/spec/features/schemes_spec.rb +++ b/spec/features/schemes_spec.rb @@ -101,9 +101,9 @@ RSpec.describe "Schemes scheme Features" do it "shows a list of schemes" do schemes.each do |scheme| - expect(page).to have_content(scheme.id) expect(page).to have_link(scheme.service_name) - expect(page).to have_content(scheme.primary_client_group) + expect(page).to have_content(scheme.id_to_display) + expect(page).to have_content(scheme.locations&.count) end end @@ -175,7 +175,8 @@ RSpec.describe "Schemes scheme Features" do click_on("Back") schemes.each do |scheme| expect(page).to have_link(scheme.service_name) - expect(page).to have_content(scheme.primary_client_group) + expect(page).to have_content(scheme.id_to_display) + expect(page).to have_content(scheme.locations&.count) end end end @@ -671,7 +672,8 @@ RSpec.describe "Schemes scheme Features" do it "shows list of links to schemes" do schemes.each do |scheme| expect(page).to have_link(scheme.service_name) - expect(page).to have_content(scheme.primary_client_group) + expect(page).to have_content(scheme.id_to_display) + expect(page).to have_content(scheme.locations&.count) end end diff --git a/spec/helpers/tab_nav_helper_spec.rb b/spec/helpers/tab_nav_helper_spec.rb index b73200c4a..b2273aa11 100644 --- a/spec/helpers/tab_nav_helper_spec.rb +++ b/spec/helpers/tab_nav_helper_spec.rb @@ -23,14 +23,14 @@ RSpec.describe TabNavHelper do describe "#location_cell" do it "returns the location link to the postcode with optional name" do link = "/schemes/#{location.scheme.id}/locations/#{location.id}/edit" - expected_html = "#{location.postcode}\nLocation #{location.name}" + expected_html = "#{location.postcode}\nLocation" expect(location_cell_postcode(location, link)).to match(expected_html) end end describe "#scheme_cell" do it "returns the scheme link service name and primary user group separated by a newline character" do - expected_html = "#{scheme.service_name}\nScheme #{scheme.primary_client_group}" + expected_html = "#{scheme.service_name}\nScheme" expect(scheme_cell(scheme)).to match(expected_html) end end diff --git a/spec/models/form/sales/pages/handover_date_spec.rb b/spec/models/form/sales/pages/handover_date_spec.rb index fa2156cf7..1699dbf9e 100644 --- a/spec/models/form/sales/pages/handover_date_spec.rb +++ b/spec/models/form/sales/pages/handover_date_spec.rb @@ -28,8 +28,6 @@ RSpec.describe Form::Sales::Pages::HandoverDate, type: :model do end it "has the correct depends_on" do - expect(page.depends_on).to eq([{ - "ownershipsch" => 1, - }]) + expect(page.depends_on).to eq([{ "ownershipsch" => 1, "resale" => 2 }]) end end diff --git a/spec/models/form/sales/questions/deposit_amount_spec.rb b/spec/models/form/sales/questions/deposit_amount_spec.rb index db47387d3..961576d62 100644 --- a/spec/models/form/sales/questions/deposit_amount_spec.rb +++ b/spec/models/form/sales/questions/deposit_amount_spec.rb @@ -46,4 +46,8 @@ RSpec.describe Form::Sales::Questions::DepositAmount, type: :model do it "has correct min" do expect(question.min).to eq(0) end + + it "has correct max" do + expect(question.max).to eq(9_999_999) + end end diff --git a/spec/models/form/sales/questions/mortgage_amount_spec.rb b/spec/models/form/sales/questions/mortgage_amount_spec.rb index eadec2876..832b47d37 100644 --- a/spec/models/form/sales/questions/mortgage_amount_spec.rb +++ b/spec/models/form/sales/questions/mortgage_amount_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Form::Sales::Questions::MortgageAmount, type: :model do end it "has the correct hint" do - expect(question.hint_text).to be_nil + expect(question.hint_text).to eq("Enter the amount of mortgage agreed with the mortgage lender. Exclude any deposits or cash payments. Numeric in pounds. Rounded to the nearest pound.") end it "has correct width" do diff --git a/spec/models/validations/sales/household_validations_spec.rb b/spec/models/validations/sales/household_validations_spec.rb index 95313db7d..5deb7eb2d 100644 --- a/spec/models/validations/sales/household_validations_spec.rb +++ b/spec/models/validations/sales/household_validations_spec.rb @@ -3,43 +3,46 @@ require "rails_helper" RSpec.describe Validations::Sales::HouseholdValidations do subject(:household_validator) { validator_class.new } - let(:record) { FactoryBot.build(:sales_log) } let(:validator_class) { Class.new { include Validations::Sales::HouseholdValidations } } describe "#validate_number_of_other_people_living_in_the_property" do context "when within permitted bounds" do + let(:record) { build(:sales_log, hholdcount: 2) } + it "does not add an error" do - record.hholdcount = 2 household_validator.validate_number_of_other_people_living_in_the_property(record) - expect(record.errors).not_to be_present + expect(record.errors[:hholdcount]).not_to be_present end end context "when blank" do + let(:record) { build(:sales_log, hholdcount: nil) } + it "does not add an error" do - record.hholdcount = nil household_validator.validate_number_of_other_people_living_in_the_property(record) - expect(record.errors).not_to be_present + expect(record.errors[:hholdcount]).not_to be_present end end context "when below lower bound" do + let(:record) { build(:sales_log, hholdcount: -1) } + it "adds an error" do - record.hholdcount = -1 household_validator.validate_number_of_other_people_living_in_the_property(record) - expect(record.errors).to be_present + expect(record.errors[:hholdcount]).to be_present end end context "when higher than upper bound" do + let(:record) { build(:sales_log, hholdcount: 5) } + it "adds an error" do - record.hholdcount = 5 household_validator.validate_number_of_other_people_living_in_the_property(record) - expect(record.errors).to be_present + expect(record.errors[:hholdcount]).to be_present end end end diff --git a/spec/models/validations/sales/sale_information_validations_spec.rb b/spec/models/validations/sales/sale_information_validations_spec.rb new file mode 100644 index 000000000..575eedfff --- /dev/null +++ b/spec/models/validations/sales/sale_information_validations_spec.rb @@ -0,0 +1,49 @@ +require "rails_helper" + +RSpec.describe Validations::Sales::SaleInformationValidations do + subject(:sale_information_validator) { validator_class.new } + + let(:validator_class) { Class.new { include Validations::Sales::SaleInformationValidations } } + + describe "#validate_deposit_range" do + context "when within permitted bounds" do + let(:record) { build(:sales_log, deposit: 0) } + + it "does not add an error" do + sale_information_validator.validate_deposit_range(record) + + expect(record.errors[:deposit]).not_to be_present + end + end + + context "when blank" do + let(:record) { build(:sales_log, deposit: nil) } + + it "does not add an error" do + sale_information_validator.validate_deposit_range(record) + + expect(record.errors[:deposit]).not_to be_present + end + end + + context "when below lower bound" do + let(:record) { build(:sales_log, deposit: -1) } + + it "adds an error" do + sale_information_validator.validate_deposit_range(record) + + expect(record.errors[:deposit]).to be_present + end + end + + context "when higher than upper bound" do + let(:record) { build(:sales_log, deposit: 1_000_000) } + + it "adds an error" do + sale_information_validator.validate_deposit_range(record) + + expect(record.errors[:deposit]).to be_present + end + end + end +end diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb index 04a740dc1..dcf67cb71 100644 --- a/spec/requests/form_controller_spec.rb +++ b/spec/requests/form_controller_spec.rb @@ -658,7 +658,7 @@ RSpec.describe FormController, type: :request do let(:referrer) { "/lettings-logs/#{completed_lettings_log.id}/net-income-value-check?referrer=check_answers" } before do - completed_lettings_log.update!(ecstat1: 1, earnings: 130, hhmemb: 1) # we're not routing to that page, so it gets cleared?§ + completed_lettings_log.update!(ecstat1: 1, earnings: 130, hhmemb: 1) # we're not routing to that page, so it gets cleared? allow(completed_lettings_log).to receive(:net_income_soft_validation_triggered?).and_return(true) allow(completed_lettings_log.form).to receive(:end_date).and_return(Time.zone.today + 1.day) post "/lettings-logs/#{completed_lettings_log.id}/form", params: interrupt_params, headers: headers.merge({ "HTTP_REFERER" => referrer })