From 2a3504fe7d8eab5ba7345be8797bcb6efa0bd2d4 Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 24 May 2023 18:34:17 +0100 Subject: [PATCH] Check correct template for lettings --- .../bulk_upload/lettings/validator.rb | 7 ++++ .../lettings/year2022/csv_parser.rb | 4 +++ .../lettings/year2023/csv_parser.rb | 20 +++++++++++ config/locales/en.yml | 3 +- .../bulk_upload/lettings/validator_spec.rb | 33 +++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/services/bulk_upload/lettings/validator.rb b/app/services/bulk_upload/lettings/validator.rb index 68cb5be08..97261fd91 100644 --- a/app/services/bulk_upload/lettings/validator.rb +++ b/app/services/bulk_upload/lettings/validator.rb @@ -8,6 +8,7 @@ class BulkUpload::Lettings::Validator validate :validate_file_not_empty validate :validate_field_numbers_count validate :validate_max_columns_count_if_no_headers + validate :validate_correct_template def initialize(bulk_upload:, path:) @bulk_upload = bulk_upload @@ -158,6 +159,12 @@ private errors.add(:base, :over_max_column_count) if csv_parser.too_many_columns? end + def validate_correct_template + return if halt_validations? + + errors.add(:base, :wrong_template) unless csv_parser.correct_template_for_year? + end + def halt_validations! @halt_validations = true end diff --git a/app/services/bulk_upload/lettings/year2022/csv_parser.rb b/app/services/bulk_upload/lettings/year2022/csv_parser.rb index 08cf4709d..6b9378b6e 100644 --- a/app/services/bulk_upload/lettings/year2022/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2022/csv_parser.rb @@ -61,6 +61,10 @@ class BulkUpload::Lettings::Year2022::CsvParser max_columns_count > MAX_COLUMNS end + def correct_template_for_year? + true + end + private def default_field_numbers diff --git a/app/services/bulk_upload/lettings/year2023/csv_parser.rb b/app/services/bulk_upload/lettings/year2023/csv_parser.rb index b3b959be6..98830c7ab 100644 --- a/app/services/bulk_upload/lettings/year2023/csv_parser.rb +++ b/app/services/bulk_upload/lettings/year2023/csv_parser.rb @@ -1,6 +1,8 @@ require "csv" class BulkUpload::Lettings::Year2023::CsvParser + include CollectionTimeHelper + FIELDS = 134 MAX_COLUMNS = 142 @@ -61,6 +63,12 @@ class BulkUpload::Lettings::Year2023::CsvParser max_columns_count > MAX_COLUMNS end + def correct_template_for_year? + collection_start_year_for_date(first_record_start_date) == 2023 + rescue Date::Error + true + end + private def default_field_numbers @@ -92,4 +100,16 @@ private @normalised_string end + + def has_field_in_header?(field) + rows[rows.find_index { |row| row[0].match(/field number/i) }].any? { |cell| cell&.match?(/#{field}/i) } + end + + def first_record_start_date + if with_headers? + Date.new(row_parsers.first.field_98.to_i + 2000, row_parsers.first.field_97.to_i, row_parsers.first.field_96.to_i) + else + Date.new(rows.first[97].to_i + 2000, rows.first[96].to_i, rows.first[95].to_i) + end + end end diff --git a/config/locales/en.yml b/config/locales/en.yml index 6c3ee5c75..8bf58586f 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -50,12 +50,13 @@ en: base: wrong_field_numbers_count: "Incorrect number of fields, please ensure you have used the correct template" over_max_column_count: "Too many columns, please ensure you have used the correct template" + wrong_template: "Incorrect start dates, please ensure you have used the correct template" bulk_upload/sales/validator: attributes: base: wrong_field_numbers_count: "Incorrect number of fields, please ensure you have used the correct template" over_max_column_count: "Too many columns, please ensure you have used the correct template" - wrong_template: "Incorrect fields, please ensure you have used the correct template" + wrong_template: "Incorrect sale dates, please ensure you have used the correct template" forms/bulk_upload_lettings/year: attributes: year: diff --git a/spec/services/bulk_upload/lettings/validator_spec.rb b/spec/services/bulk_upload/lettings/validator_spec.rb index f4fd98a12..192f2e0ed 100644 --- a/spec/services/bulk_upload/lettings/validator_spec.rb +++ b/spec/services/bulk_upload/lettings/validator_spec.rb @@ -191,6 +191,39 @@ RSpec.describe BulkUpload::Lettings::Validator do end end end + + context "when uploading a 2022 template for 2023 bulk upload" do + let(:bulk_upload) { create(:bulk_upload, user:, year: 2023) } + let(:log) { build(:lettings_log, :completed, startdate: Time.zone.local(2022, 5, 6)) } + + context "with no headers" do + before do + file.write(BulkUpload::LettingsLogToCsv.new(log:, line_ending: "\r\n", col_offset: 0).to_2022_csv_row) + file.close + end + + it "is not valid" do + expect(validator).not_to be_valid + end + end + + context "with headers" do + let(:seed) { rand } + let(:log_to_csv) { BulkUpload::LettingsLogToCsv.new(log:) } + let(:field_numbers) { log_to_csv.default_2022_field_numbers + %w[invalid_field_number] } + let(:field_values) { log_to_csv.to_2022_row + %w[value_for_invalid_field_number] } + + before do + file.write(log_to_csv.custom_field_numbers_row(seed:, field_numbers:)) + file.write(log_to_csv.to_custom_csv_row(seed:, field_values:)) + file.rewind + end + + it "is not valid" do + expect(validator).not_to be_valid + end + end + end end end