Browse Source

Reimport logs with created by missing

pull/1919/head
Kat 3 years ago
parent
commit
6ef10dbc82
  1. 19
      app/services/imports/lettings_logs_field_import_service.rb
  2. 2
      lib/tasks/data_import_field.rake
  3. 12
      spec/lib/tasks/data_import_field_spec.rb
  4. 72
      spec/services/imports/lettings_logs_field_import_service_spec.rb

19
app/services/imports/lettings_logs_field_import_service.rb

@ -18,6 +18,8 @@ module Imports
import_from(folder, :update_reason)
when "homeless"
import_from(folder, :update_homelessness)
when "created_by"
import_from(folder, :update_created_by)
else
raise "Updating #{field} is not supported by the field import service"
end
@ -230,5 +232,22 @@ module Imports
@logger.warn("Could not find record matching legacy ID #{old_id}")
end
end
# deletes and recreates the entire record if created_by is missing
def update_created_by(xml_doc)
return if meta_field_value(xml_doc, "form-name").include?("Sales")
old_id = meta_field_value(xml_doc, "document-id")
record = LettingsLog.find_by(old_id:)
return @logger.warn("lettings log with old id #{old_id} not found") unless record
return @logger.info("lettings log #{record.id} has created_by value, skipping update") if record.created_by.present?
record.destroy!
@logger.info("lettings log #{record.id} has been deleted")
log_import_service = Imports::LettingsLogsImportService.new(nil, @logger)
log_import_service.send(:create_log, xml_doc)
@logger.info("lettings log \"#{record.old_id}\" has been reimported with id #{record.id}")
end
end
end

2
lib/tasks/data_import_field.rake

@ -7,7 +7,7 @@ namespace :core do
# We only allow a reduced list of known fields to be updatable
case field
when "tenancycode", "major_repairs", "lettings_allocation", "offered", "address", "reason", "homeless"
when "tenancycode", "major_repairs", "lettings_allocation", "offered", "address", "reason", "homeless", "created_by"
s3_service = Storage::S3Service.new(PlatformHelper.is_paas? ? Configuration::PaasConfigurationService.new : Configuration::EnvConfigurationService.new, ENV["IMPORT_PAAS_INSTANCE"])
archive_io = s3_service.get_file_io(path)
archive_service = Storage::ArchiveService.new(archive_io)

12
spec/lib/tasks/data_import_field_spec.rb

@ -128,6 +128,18 @@ describe "data_import_field imports" do
end
end
context "and we update the created_by field" do
let(:field) { "created_by" }
it "updates the 2023 logs from the given XML file" do
expect(Storage::S3Service).to receive(:new).with(paas_config_service, instance_name)
expect(storage_service).to receive(:get_file_io).with("spec/fixtures/imports/logs")
expect(Imports::LettingsLogsFieldImportService).to receive(:new).with(archive_service)
expect(import_service).to receive(:update_field).with(field, "logs")
task.invoke(field, fixture_path)
end
end
it "raises an exception if no parameters are provided" do
expect { task.invoke }.to raise_error(/Usage/)
end

72
spec/services/imports/lettings_logs_field_import_service_spec.rb

@ -707,4 +707,76 @@ RSpec.describe Imports::LettingsLogsFieldImportService do
end
end
end
context "when updating created_by" do
let(:field) { "created_by" }
let(:lettings_log) { LettingsLog.find_by(old_id: lettings_log_id) }
let(:old_log_id) { lettings_log.id }
before do
Imports::LettingsLogsImportService.new(storage_service, logger).create_logs(fixture_directory)
old_log_id
lettings_log_file.rewind
lettings_log.update!(values_updated_at: nil)
end
context "when the lettings log has created_by value" do
it "skips the update" do
expect(logger).to receive(:info).with(/lettings log \d+ has created_by value, skipping update/)
import_service.send(:update_created_by, lettings_log_xml)
old_lettings_log = LettingsLog.find(old_log_id)
expect(old_lettings_log).not_to be_nil
new_lettings_log = LettingsLog.find_by(old_id: lettings_log_id)
expect(new_lettings_log).to eq(old_lettings_log)
expect(new_lettings_log.values_updated_at).to be_nil
end
end
context "when the lettings log has no created_by value" do
before do
lettings_log.update!(created_by: nil)
end
it "deletes the existing lettings log and creates a new log with correct created_by" do
expect(logger).to receive(:info).with(/lettings log \d+ has been deleted/)
expect(logger).to receive(:info).with(/lettings log "0ead17cb-1668-442d-898c-0d52879ff592" has been reimported with id \d+/)
import_service.send(:update_created_by, lettings_log_xml)
old_lettings_log = LettingsLog.find_by(id: old_log_id)
expect(old_lettings_log).to be_nil
new_lettings_log = LettingsLog.find_by(old_id: lettings_log_id)
expect(new_lettings_log).not_to eq(old_lettings_log)
expect(new_lettings_log.values_updated_at).not_to be_nil
end
it "deletes the existing lettings log and creates a new log with correct unassigned created_by" do
lettings_log_xml.at_xpath("//meta:owner-user-id").content = "fake_id"
expect(logger).to receive(:info).with(/lettings log \d+ has been deleted/)
expect(logger).to receive(:info).with(/lettings log "0ead17cb-1668-442d-898c-0d52879ff592" has been reimported with id \d+/)
expect(logger).to receive(:error).with(/Lettings log '0ead17cb-1668-442d-898c-0d52879ff592' belongs to legacy user with owner-user-id: 'fake_id' which cannot be found. Assigning log to 'Unassigned' user./)
import_service.send(:update_created_by, lettings_log_xml)
old_lettings_log = LettingsLog.find_by(id: old_log_id)
expect(old_lettings_log).to be_nil
new_lettings_log = LettingsLog.find_by(old_id: lettings_log_id)
expect(new_lettings_log).not_to eq(old_lettings_log)
expect(new_lettings_log.created_by.name).to eq("Unassigned")
expect(new_lettings_log.values_updated_at).not_to be_nil
end
end
context "and the log was not previously imported" do
it "logs a warning that the log has not been found in the db" do
lettings_log.destroy!
expect(logger).to receive(:warn).with("lettings log with old id #{lettings_log_id} not found")
expect { import_service.send(:update_created_by, lettings_log_xml) }.not_to change(LettingsLog, :count)
end
end
end
end

Loading…
Cancel
Save