Browse Source

CLDC-4300: Update sale date staircasing date validation (#3341)

* CLDC-4300: Stricten validation on initialpurchase

* CLDC-4300: Add a correction script

* CLDC-4300: Update tests

* CLDC-4300: Ensure lasttransaction cannot equal saledate or initialtransaction

* CLDC-4300: Update date correcting rake to also account for lasttransaction = initialpurchase

* CLDC-4300: Revert updates to copy

* CLDC-4300: Apply these changes from 2026 only

* CLDC-4300: Compare lasttransaction to saledate

due to the it <= lt <= sd relationship, there's no need to comparse it to sd. if it == sd then it == lt and lt == sd

* CLDC-4300: Fix script in cases where all 3 dates are equal
main
Samuel Young 1 day ago committed by GitHub
parent
commit
614fd111e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 6
      app/models/validations/sales/sale_information_validations.rb
  2. 15
      lib/tasks/fix_sales_logs_with_invalid_initialpurchase_lasttransaction.rake
  3. 69
      spec/models/validations/sales/sale_information_validations_spec.rb

6
app/models/validations/sales/sale_information_validations.rb

@ -42,7 +42,7 @@ module Validations::Sales::SaleInformationValidations
record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_after_1980") record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_after_1980")
end end
if record.saledate.present? && record.initialpurchase > record.saledate if record.saledate.present? && ((record.initialpurchase > record.saledate) || (record.initialpurchase == record.saledate && record.form.start_year_2026_or_later?))
record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_saledate") record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_saledate")
record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.sale_information.saledate.must_be_after_initial_purchase_date") record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.sale_information.saledate.must_be_after_initial_purchase_date")
end end
@ -55,11 +55,11 @@ module Validations::Sales::SaleInformationValidations
record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_after_1980") record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_after_1980")
end end
if record.saledate.present? && record.lasttransaction > record.saledate if record.saledate.present? && ((record.lasttransaction > record.saledate) || (record.lasttransaction == record.saledate && record.form.start_year_2026_or_later?))
record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_before_saledate") record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_before_saledate")
record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.sale_information.saledate.must_be_after_last_transaction_date") record.errors.add :saledate, :skip_bu_error, message: I18n.t("validations.sales.sale_information.saledate.must_be_after_last_transaction_date")
end end
if record.initialpurchase.present? && record.lasttransaction < record.initialpurchase if record.initialpurchase.present? && ((record.lasttransaction < record.initialpurchase) || (record.lasttransaction == record.initialpurchase && record.form.start_year_2026_or_later?))
record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_last_transaction") record.errors.add :initialpurchase, I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_last_transaction")
record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_after_initial_purchase") record.errors.add :lasttransaction, I18n.t("validations.sales.sale_information.lasttransaction.must_be_after_initial_purchase")
end end

15
lib/tasks/fix_sales_logs_with_invalid_initialpurchase_lasttransaction.rake

@ -0,0 +1,15 @@
desc "We tightened the validation between initial purchase date in 2026, last transaction date and sale date so the two can no longer be equal. To avoid invalid logs we clear initialpurchase if it equals saledate and if initialpurchase = lasttransaction we clear both"
task fix_sales_logs_with_invalid_initialpurchase_lasttransaction: :environment do
initial_purchase_equal_lasttransaction_logs = SalesLog.filter_by_year_or_later(2026).where("initialpurchase = lasttransaction")
lasttransaction_equal_saledate_logs = SalesLog.filter_by_year_or_later(2026).where("lasttransaction = saledate")
# this one must happen first since this will always result in a log that passes date validations
puts "Updating #{initial_purchase_equal_lasttransaction_logs.count} logs where initialpurchase = lasttransaction, #{initial_purchase_equal_lasttransaction_logs.map(&:id)}"
initial_purchase_equal_lasttransaction_logs.update!(initialpurchase: nil, lasttransaction: nil)
# this one could fail if lasttransaction == saledate == initialpurchase, but the above case will have already reset these logs
puts "Updating #{lasttransaction_equal_saledate_logs.count} logs where lasttransaction = saledate, #{lasttransaction_equal_saledate_logs.map(&:id)}"
lasttransaction_equal_saledate_logs.update!(lasttransaction: nil)
puts "Done"
end

69
spec/models/validations/sales/sale_information_validations_spec.rb

@ -252,12 +252,27 @@ 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: current_collection_start_date, saledate: current_collection_start_date) } let(:record) { build(:sales_log, initialpurchase: collection_start_date_for_year(start_year), saledate: collection_start_date_for_year(start_year)) }
it "does not add an error" do context "and 2025", metadata: { year: 25 } do
sale_information_validator.validate_staircasing_initial_purchase_date(record) let(:start_year) { 2025 }
expect(record.errors[:initialpurchase]).not_to be_present it "does not add an error" do
sale_information_validator.validate_staircasing_initial_purchase_date(record)
expect(record.errors[:lasttransaction]).not_to be_present
end
end
context "and 2026", metadata: { year: 26 } do
let(:start_year) { 2026 }
it "adds error" do
sale_information_validator.validate_staircasing_initial_purchase_date(record)
expect(record.errors[:initialpurchase]).to eq([I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_saledate")])
expect(record.errors[:saledate]).to eq([I18n.t("validations.sales.sale_information.saledate.must_be_after_initial_purchase_date")])
end
end end
end end
end end
@ -315,12 +330,27 @@ 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: current_collection_start_date, saledate: current_collection_start_date) } let(:record) { build(:sales_log, lasttransaction: collection_start_date_for_year(start_year), saledate: collection_start_date_for_year(start_year)) }
it "does not add an error" do context "and 2025", metadata: { year: 25 } do
sale_information_validator.validate_staircasing_last_transaction_date(record) let(:start_year) { 2025 }
expect(record.errors[:lasttransaction]).not_to be_present it "does not add an error" do
sale_information_validator.validate_staircasing_last_transaction_date(record)
expect(record.errors[:lasttransaction]).not_to be_present
end
end
context "and 2026", metadata: { year: 26 } do
let(:start_year) { 2026 }
it "adds error" do
sale_information_validator.validate_staircasing_last_transaction_date(record)
expect(record.errors[:lasttransaction]).to eq([I18n.t("validations.sales.sale_information.lasttransaction.must_be_before_saledate")])
expect(record.errors[:saledate]).to eq([I18n.t("validations.sales.sale_information.saledate.must_be_after_last_transaction_date")])
end
end end
end end
@ -346,12 +376,27 @@ 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: current_collection_start_date, initialpurchase: current_collection_start_date) } let(:record) { build(:sales_log, lasttransaction: collection_start_date_for_year(start_year), initialpurchase: collection_start_date_for_year(start_year), saledate: collection_start_date_for_year(start_year) + 1.day) }
it "does not add an error" do context "and 2025", metadata: { year: 25 } do
sale_information_validator.validate_staircasing_last_transaction_date(record) let(:start_year) { 2025 }
expect(record.errors[:lasttransaction]).not_to be_present it "does not add an error" do
sale_information_validator.validate_staircasing_last_transaction_date(record)
expect(record.errors[:lasttransaction]).not_to be_present
end
end
context "and 2026", metadata: { year: 26 } do
let(:start_year) { 2026 }
it "adds error" do
sale_information_validator.validate_staircasing_last_transaction_date(record)
expect(record.errors[:lasttransaction]).to eq([I18n.t("validations.sales.sale_information.lasttransaction.must_be_after_initial_purchase")])
expect(record.errors[:initialpurchase]).to eq([I18n.t("validations.sales.sale_information.initialpurchase.must_be_before_last_transaction")])
end
end end
end end
end end

Loading…
Cancel
Save