diff --git a/app/models/sales_log.rb b/app/models/sales_log.rb index 0f660ceb0..9860a868c 100644 --- a/app/models/sales_log.rb +++ b/app/models/sales_log.rb @@ -1,11 +1,10 @@ class SalesLogValidator < ActiveModel::Validator + include Validations::SharedValidations + include Validations::LocalAuthorityValidations include Validations::Sales::HouseholdValidations include Validations::Sales::FinancialValidations include Validations::Sales::SaleInformationValidations - include Validations::SharedValidations - include Validations::LocalAuthorityValidations - def validate(record) validation_methods = public_methods.select { |method| method.starts_with?("validate_") } validation_methods.each { |meth| public_send(meth, record) } diff --git a/app/models/validations/sales/sale_information_validations.rb b/app/models/validations/sales/sale_information_validations.rb index 4c8747f18..11049e8ff 100644 --- a/app/models/validations/sales/sale_information_validations.rb +++ b/app/models/validations/sales/sale_information_validations.rb @@ -6,4 +6,12 @@ module Validations::Sales::SaleInformationValidations record.errors.add :deposit, "Cash deposit must be £0 - £999,999" end end + + def validate_pratical_completion_date_before_saledate(record) + return if record.saledate.blank? || record.hodate.blank? + + unless record.saledate > record.hodate + record.errors.add :hodate, "Practical completion or handover date must be before exchange date" + 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 index 575eedfff..e3dc9f0d7 100644 --- a/spec/models/validations/sales/sale_information_validations_spec.rb +++ b/spec/models/validations/sales/sale_information_validations_spec.rb @@ -46,4 +46,66 @@ RSpec.describe Validations::Sales::SaleInformationValidations do end end end + + describe "#validate_pratical_completion_date_before_saledate" do + context "when hodate blank" do + let(:record) { build(:sales_log, hodate: nil) } + + it "does not add an error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors).not_to be_present + end + end + + context "when saledate blank" do + let(:record) { build(:sales_log, saledate: nil) } + + it "does not add an error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors).not_to be_present + end + end + + context "when saledate and hodate blank" do + let(:record) { build(:sales_log, hodate: nil, saledate: nil) } + + it "does not add an error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors).not_to be_present + end + end + + context "when hodate before saledate" do + let(:record) { build(:sales_log, hodate: 2.months.ago, saledate: 1.month.ago) } + + it "does not add an error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors).not_to be_present + end + end + + context "when hodate after saledate" do + let(:record) { build(:sales_log, hodate: 1.month.ago, saledate: 2.months.ago) } + + it "adds error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors[:hodate]).to be_present + end + end + + context "when hodate == saledate" do + let(:record) { build(:sales_log, hodate: Time.zone.parse("2023-07-01"), saledate: Time.zone.parse("2023-07-01")) } + + it "does not add an error" do + sale_information_validator.validate_pratical_completion_date_before_saledate(record) + + expect(record.errors[:hodate]).to be_present + end + end + end end