|
|
@ -1,6 +1,8 @@ |
|
|
|
require "rails_helper" |
|
|
|
require "rails_helper" |
|
|
|
|
|
|
|
|
|
|
|
RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
|
|
|
|
include CollectionTimeHelper |
|
|
|
|
|
|
|
|
|
|
|
subject(:sale_information_validator) { validator_class.new } |
|
|
|
subject(:sale_information_validator) { validator_class.new } |
|
|
|
|
|
|
|
|
|
|
|
let(:validator_class) { Class.new { include Validations::Sales::SaleInformationValidations } } |
|
|
|
let(:validator_class) { Class.new { include Validations::Sales::SaleInformationValidations } } |
|
|
@ -47,7 +49,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when hodate less than 3 years before saledate" do |
|
|
|
context "when hodate less than 3 years before saledate" do |
|
|
|
let(:record) { build(:sales_log, hodate: Date.new(2021, 12, 2), saledate: Date.new(2024, 12, 1)) } |
|
|
|
let(:record) { build(:sales_log, hodate: current_collection_start_date - 3.years + 1.day, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
@ -57,8 +59,8 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when hodate 3 or more years before saledate" do |
|
|
|
context "when hodate 3 or more years before saledate" do |
|
|
|
context "and form year is 2023 or earlier" do |
|
|
|
context "and form year is 2024 or earlier" do |
|
|
|
let(:record) { build(:sales_log, hodate: Date.new(2020, 12, 1), saledate: Date.new(2023, 12, 1)) } |
|
|
|
let(:record) { build(:sales_log, hodate: previous_collection_start_date - 3.years, saledate: previous_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does add an error" do |
|
|
|
it "does add an error" do |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
@ -68,17 +70,29 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "and form year is 2024 or later" do |
|
|
|
context "and form year is 2025 or later" do |
|
|
|
let(:record) { build(:sales_log, hodate: Date.new(2021, 12, 1), saledate: Date.new(2024, 12, 1)) } |
|
|
|
let(:record) { build(:sales_log, hodate: current_collection_start_date - 3.years, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "adds an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
|
|
|
|
|
|
|
|
expect(record.errors[:hodate]).to be_present |
|
|
|
expect(record.errors[:hodate]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors[:saledate]).to be_empty |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when hodate 5 or more years before saledate" do |
|
|
|
|
|
|
|
let(:record) { build(:sales_log, hodate: current_collection_start_date - 5.years, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(record.errors[:hodate]).to be_present |
|
|
|
|
|
|
|
expect(record.errors[:saledate]).to be_present |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when hodate after saledate" do |
|
|
|
context "when hodate after saledate" do |
|
|
|
let(:record) { build(:sales_log, hodate: 1.month.ago, saledate: 2.months.ago) } |
|
|
|
let(:record) { build(:sales_log, hodate: 1.month.ago, saledate: 2.months.ago) } |
|
|
|
|
|
|
|
|
|
|
@ -90,7 +104,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when hodate == saledate" do |
|
|
|
context "when hodate == saledate" do |
|
|
|
let(:record) { build(:sales_log, hodate: Time.zone.parse("2023-07-01"), saledate: Time.zone.parse("2023-07-01")) } |
|
|
|
let(:record) { build(:sales_log, hodate: current_collection_start_date, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
|
sale_information_validator.validate_practical_completion_date(record) |
|
|
@ -172,7 +186,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when exdate == saledate" do |
|
|
|
context "when exdate == saledate" do |
|
|
|
let(:record) { build(:sales_log, exdate: Time.zone.parse("2023-07-01"), saledate: Time.zone.parse("2023-07-01")) } |
|
|
|
let(:record) { build(:sales_log, exdate: current_collection_start_date, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_exchange_date(record) |
|
|
|
sale_information_validator.validate_exchange_date(record) |
|
|
@ -235,7 +249,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when initial purchase date == saledate" do |
|
|
|
context "when initial purchase date == saledate" do |
|
|
|
let(:record) { build(:sales_log, initialpurchase: Time.zone.parse("2023-07-01"), saledate: Time.zone.parse("2023-07-01")) } |
|
|
|
let(:record) { build(:sales_log, initialpurchase: current_collection_start_date, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_staircasing_initial_purchase_date(record) |
|
|
|
sale_information_validator.validate_staircasing_initial_purchase_date(record) |
|
|
@ -298,7 +312,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when last transaction date == saledate" do |
|
|
|
context "when last transaction date == saledate" do |
|
|
|
let(:record) { build(:sales_log, lasttransaction: Time.zone.parse("2023-07-01"), saledate: Time.zone.parse("2023-07-01")) } |
|
|
|
let(:record) { build(:sales_log, lasttransaction: current_collection_start_date, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_staircasing_last_transaction_date(record) |
|
|
|
sale_information_validator.validate_staircasing_last_transaction_date(record) |
|
|
@ -329,7 +343,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when last transaction date == initial purchase date" do |
|
|
|
context "when last transaction date == initial purchase date" do |
|
|
|
let(:record) { build(:sales_log, lasttransaction: Time.zone.parse("2023-07-01"), initialpurchase: Time.zone.parse("2023-07-01")) } |
|
|
|
let(:record) { build(:sales_log, lasttransaction: current_collection_start_date, initialpurchase: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_staircasing_last_transaction_date(record) |
|
|
|
sale_information_validator.validate_staircasing_last_transaction_date(record) |
|
|
@ -649,27 +663,10 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
expect(record.errors["grant"]).to be_empty |
|
|
|
expect(record.errors["grant"]).to be_empty |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when it is a 2023 log" do |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, deposit: 5_000, grant: 3_000, value: 20_000, discount: 10, ownershipsch: 2, saledate: Time.zone.local(2023, 4, 1)) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "returns false" do |
|
|
|
|
|
|
|
record.mortgage = 10 |
|
|
|
|
|
|
|
sale_information_validator.validate_discounted_ownership_value(record) |
|
|
|
|
|
|
|
expect(record.errors["mortgageused"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["mortgage"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["value"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["deposit"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["ownershipsch"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["discount"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["grant"]).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_outright_sale_value_matches_mortgage_plus_deposit" do |
|
|
|
describe "#validate_outright_sale_value_matches_mortgage_plus_deposit" do |
|
|
|
context "with a 2024 outright sale log" do |
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 300_000, ownershipsch: 3, saledate: current_collection_start_date) } |
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 300_000, ownershipsch: 3, saledate: Time.zone.local(2024, 5, 1)) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when a mortgage is used" do |
|
|
|
context "when a mortgage is used" do |
|
|
|
before do |
|
|
|
before do |
|
|
@ -742,19 +739,6 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "with a 2023 outright sale log" do |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 300_000, ownershipsch: 3, saledate: Time.zone.local(2023, 5, 1)) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add errors" do |
|
|
|
|
|
|
|
record.mortgageused = 1 |
|
|
|
|
|
|
|
record.mortgage = 100_000 |
|
|
|
|
|
|
|
record.deposit = 100_000 |
|
|
|
|
|
|
|
sale_information_validator.validate_outright_sale_value_matches_mortgage_plus_deposit(record) |
|
|
|
|
|
|
|
expect(record.errors).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_basic_monthly_rent" do |
|
|
|
describe "#validate_basic_monthly_rent" do |
|
|
|
context "when within permitted bounds" do |
|
|
|
context "when within permitted bounds" do |
|
|
|
let(:record) { build(:sales_log, mrent: 9998, ownershipsch: 1, type: 2) } |
|
|
|
let(:record) { build(:sales_log, mrent: 9998, ownershipsch: 1, type: 2) } |
|
|
@ -814,7 +798,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_grant_amount" do |
|
|
|
describe "#validate_grant_amount" do |
|
|
|
context "when within permitted bounds" do |
|
|
|
context "when within permitted bounds" do |
|
|
|
let(:record) { build(:sales_log, grant: 10_000, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, grant: 10_000, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -824,7 +808,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when over the max" do |
|
|
|
context "when over the max" do |
|
|
|
let(:record) { build(:sales_log, type: 8, grant: 17_000, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, type: 8, grant: 17_000, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "adds an error" do |
|
|
|
it "adds an error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -834,7 +818,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when under the min" do |
|
|
|
context "when under the min" do |
|
|
|
let(:record) { build(:sales_log, type: 21, grant: 3, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, type: 21, grant: 3, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "adds an error" do |
|
|
|
it "adds an error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -844,7 +828,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when grant is blank" do |
|
|
|
context "when grant is blank" do |
|
|
|
let(:record) { build(:sales_log, type: 21, grant: nil, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, type: 21, grant: nil, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -854,7 +838,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when over the max and type is not RTA of social homebuy" do |
|
|
|
context "when over the max and type is not RTA of social homebuy" do |
|
|
|
let(:record) { build(:sales_log, type: 9, grant: 17_000, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, type: 9, grant: 17_000, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
it "does not add an error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -864,7 +848,7 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when under the min and type is not RTA of social homebuy" do |
|
|
|
context "when under the min and type is not RTA of social homebuy" do |
|
|
|
let(:record) { build(:sales_log, type: 9, grant: 17_000, saledate: Time.zone.local(2024, 4, 5)) } |
|
|
|
let(:record) { build(:sales_log, type: 9, grant: 17_000, saledate: current_collection_start_date) } |
|
|
|
|
|
|
|
|
|
|
|
it "does not add error" do |
|
|
|
it "does not add error" do |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
@ -872,20 +856,10 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
expect(record.errors).not_to be_present |
|
|
|
expect(record.errors).not_to be_present |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "with log before 2024/25 collection" do |
|
|
|
|
|
|
|
let(:record) { build(:sales_log, type: 8, grant: 3, saledate: Time.zone.local(2023, 4, 5)) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_grant_amount(record) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(record.errors).not_to be_present |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_stairbought" do |
|
|
|
describe "#validate_stairbought" do |
|
|
|
let(:saledate) { Time.zone.local(2024, 4, 4) } |
|
|
|
let(:saledate) { current_collection_start_date } |
|
|
|
|
|
|
|
|
|
|
|
[ |
|
|
|
[ |
|
|
|
["Shared Ownership (new model lease)", 30, 90], |
|
|
|
["Shared Ownership (new model lease)", 30, 90], |
|
|
@ -930,23 +904,12 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
context "when the collection year is before 2024" do |
|
|
|
|
|
|
|
let(:record) { build(:sales_log, ownershipsch: 1, type: 24, saledate:, stairbought: 90) } |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.local(2023, 4, 4) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_stairbought(record) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
expect(record.errors).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_discount_and_value" do |
|
|
|
describe "#validate_discount_and_value" do |
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 200_000, discount: 50, ownershipsch: 2, type: 9, saledate:) } |
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 200_000, discount: 50, ownershipsch: 2, type: 9, saledate:) } |
|
|
|
let(:saledate) { Time.zone.local(2024, 4, 1) } |
|
|
|
let(:saledate) { current_collection_start_date } |
|
|
|
|
|
|
|
|
|
|
|
context "with a log in the 24/25 collection year" do |
|
|
|
|
|
|
|
context "when in London" do |
|
|
|
context "when in London" do |
|
|
|
before do |
|
|
|
before do |
|
|
|
record.la = "E09000001" |
|
|
|
record.la = "E09000001" |
|
|
@ -1008,25 +971,10 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when it is a 2023 log" do |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, value: 200_000, discount: 80, ownershipsch: 2, type: 9, saledate: Time.zone.local(2023, 4, 1), la: "E06000015") } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_discount_and_value(record) |
|
|
|
|
|
|
|
expect(record.errors["value"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["discount"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["la"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["postcode_full"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["uprn"]).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_non_staircasing_mortgage" do |
|
|
|
describe "#validate_non_staircasing_mortgage" do |
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, deposit: 5_000, value: 30_000, equity: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, deposit: 5_000, value: 30_000, equity: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
|
|
|
|
|
|
|
|
context "with a log in the 24/25 collection year" do |
|
|
|
let(:saledate) { current_collection_start_date } |
|
|
|
let(:saledate) { Time.zone.local(2024, 4, 4) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when MORTGAGE + DEPOSIT does not equal VALUE * EQUITY/100 " do |
|
|
|
context "when MORTGAGE + DEPOSIT does not equal VALUE * EQUITY/100 " do |
|
|
|
context "and it is not a staircase transaction" do |
|
|
|
context "and it is not a staircase transaction" do |
|
|
@ -1225,27 +1173,10 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when it is a 2023 log" do |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.local(2023, 4, 1) } |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgage: 10_000, staircase: 2, deposit: 5_000, value: 30_000, equity: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_non_staircasing_mortgage(record) |
|
|
|
|
|
|
|
expect(record.errors["mortgage"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["value"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["deposit"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["equity"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["cashdis"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["type"]).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_staircasing_mortgage" do |
|
|
|
describe "#validate_staircasing_mortgage" do |
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, deposit: 5_000, value: 30_000, stairbought: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 1, mortgage: 10_000, deposit: 5_000, value: 30_000, stairbought: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
|
|
|
|
|
|
|
|
context "with a log in the 24/25 collection year" do |
|
|
|
let(:saledate) { current_collection_start_date } |
|
|
|
let(:saledate) { Time.zone.local(2024, 4, 4) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when MORTGAGE + DEPOSIT does not equal STAIRBOUGHT/100 * VALUE" do |
|
|
|
context "when MORTGAGE + DEPOSIT does not equal STAIRBOUGHT/100 * VALUE" do |
|
|
|
context "and it is a staircase transaction" do |
|
|
|
context "and it is a staircase transaction" do |
|
|
@ -1340,26 +1271,9 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
expect(record.errors["type"]).to be_empty |
|
|
|
expect(record.errors["type"]).to be_empty |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when it is a 2023 log" do |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.local(2023, 4, 1) } |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgage: 10_000, staircase: 1, deposit: 5_000, value: 30_000, stairbought: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_staircasing_mortgage(record) |
|
|
|
|
|
|
|
expect(record.errors["mortgage"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["value"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["deposit"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["stairbought"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["cashdis"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["type"]).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "when mortgage is not used" do |
|
|
|
context "when mortgage is not used" do |
|
|
|
context "with a log in the 24/25 collection year" do |
|
|
|
let(:saledate) { current_collection_start_date } |
|
|
|
let(:saledate) { Time.zone.local(2024, 4, 4) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
before do |
|
|
|
before do |
|
|
|
record.mortgageused = 2 |
|
|
|
record.mortgageused = 2 |
|
|
@ -1459,22 +1373,6 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
context "when it is a 2023 log" do |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.local(2023, 4, 1) } |
|
|
|
|
|
|
|
let(:record) { FactoryBot.build(:sales_log, mortgageused: 2, staircase: 1, deposit: 5_000, value: 30_000, stairbought: 28, ownershipsch: 1, type: 30, saledate:) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add an error" do |
|
|
|
|
|
|
|
sale_information_validator.validate_staircasing_mortgage(record) |
|
|
|
|
|
|
|
expect(record.errors["mortgageused"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["value"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["deposit"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["stairbought"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["cashdis"]).to be_empty |
|
|
|
|
|
|
|
expect(record.errors["type"]).to be_empty |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
describe "#validate_mortgage_used_dont_know" do |
|
|
|
describe "#validate_mortgage_used_dont_know" do |
|
|
@ -1501,23 +1399,10 @@ RSpec.describe Validations::Sales::SaleInformationValidations do |
|
|
|
context "and it is an outright sale" do |
|
|
|
context "and it is an outright sale" do |
|
|
|
let(:ownershipsch) { 3 } |
|
|
|
let(:ownershipsch) { 3 } |
|
|
|
|
|
|
|
|
|
|
|
context "with a saledate before 24/25" do |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.local(2023, 9, 9) } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "adds errors" do |
|
|
|
|
|
|
|
expect(sales_log.errors[:mortgageused]).to include "Enter a valid value for was a mortgage used for the purchase of this property?" |
|
|
|
|
|
|
|
expect(sales_log.errors[:saledate]).to include "You must answer either ‘yes’ or ‘no’ to the question ‘was a mortgage used’ for the selected year." |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "with a saledate from 24/25 or after" do |
|
|
|
|
|
|
|
let(:saledate) { Time.zone.today } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it "does not add any errors" do |
|
|
|
it "does not add any errors" do |
|
|
|
expect(sales_log.errors).to be_empty |
|
|
|
expect(sales_log.errors).to be_empty |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
context "and it is a shared ownership scheme sale" do |
|
|
|
context "and it is a shared ownership scheme sale" do |
|
|
|
let(:ownershipsch) { 1 } |
|
|
|
let(:ownershipsch) { 1 } |
|
|
|