diff --git a/app/services/imports/lettings_logs_field_import_service.rb b/app/services/imports/lettings_logs_field_import_service.rb index f69fe5792..c7044a062 100644 --- a/app/services/imports/lettings_logs_field_import_service.rb +++ b/app/services/imports/lettings_logs_field_import_service.rb @@ -20,6 +20,8 @@ module Imports import_from(folder, :update_homelessness) when "created_by" import_from(folder, :update_created_by) + when "sex_and_relat" + import_from(folder, :update_sex_and_relat) else raise "Updating #{field} is not supported by the field import service" end @@ -249,5 +251,31 @@ module Imports log_import_service.send(:create_log, xml_doc) @logger.info("lettings log \"#{record.old_id}\" has been reimported with id #{record.id}") end + + def update_sex_and_relat(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 values for sex2 and relat2, skipping update") if record.sex2 && record.relat2 + return @logger.info("lettings log #{record.id} has no hhmemb value, skipping update") if record.hhmemb.blank? + return @logger.info("lettings log #{record.id} has value 'no' for details_known2, skipping update") if record.details_known_2 == 1 + + if record.sex2.blank? + record.sex2 = sex(xml_doc, 2) + @logger.info("lettings log #{record.id}'s sex2 value has been set to #{record.sex2}") + end + + if record.relat2.blank? + record.relat2 = relat(xml_doc, 2) + @logger.info("lettings log #{record.id}'s relat2 value has been set to #{record.relat2}") + end + + record.values_updated_at = Time.zone.now + record.save! + end end end diff --git a/spec/services/imports/lettings_logs_field_import_service_spec.rb b/spec/services/imports/lettings_logs_field_import_service_spec.rb index 669482b8a..6985200b9 100644 --- a/spec/services/imports/lettings_logs_field_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_field_import_service_spec.rb @@ -779,4 +779,103 @@ RSpec.describe Imports::LettingsLogsFieldImportService do end end end + + context "when updating sex_and_relat" do + let(:field) { "sex_and_relat" } + let(:lettings_log) { LettingsLog.find_by(old_id: lettings_log_id) } + + before do + Imports::LettingsLogsImportService.new(storage_service, logger).create_logs(fixture_directory) + lettings_log_file.rewind + lettings_log_xml.at_xpath("//xmlns:P2Sex").content = "Person prefers not to say" + lettings_log_xml.at_xpath("//xmlns:P2Rel").content = "Person prefers not to say" + end + + context "when the lettings log has no sex or relat value" do + before do + lettings_log.update!(sex2: nil, relat2: nil, details_known_2: 0, values_updated_at: nil) + end + + it "updates the lettings_log sex and relat value if details for person are known" do + expect(logger).to receive(:info).with(/lettings log \d+'s sex2 value has been set to R/) + expect(logger).to receive(:info).with(/lettings log \d+'s relat2 value has been set to R/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq("R") + expect(lettings_log.relat2).to eq("R") + expect(lettings_log.values_updated_at).not_to be_nil + end + + it "does not update the lettings_log sex and relat value if details for person are not known" do + lettings_log.update!(details_known_2: 1) + + expect(logger).to receive(:info).with(/lettings log \d+ has value 'no' for details_known2, skipping update/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq(nil) + expect(lettings_log.relat2).to eq(nil) + expect(lettings_log.values_updated_at).to be_nil + end + end + + context "when the lettings log has sex and relat value" do + before do + lettings_log.update!(sex2: "F", relat2: "R", details_known_2: 0, values_updated_at: nil) + end + + it "does not update the lettings_log sex and relat values" do + expect(logger).to receive(:info).with(/lettings log \d+ has values for sex2 and relat2, skipping update/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq("F") + expect(lettings_log.relat2).to eq("R") + expect(lettings_log.values_updated_at).to be_nil + end + end + + context "when the lettings log has sex value" do + before do + lettings_log.update!(sex2: "F", relat2: nil, details_known_2: 0, values_updated_at: nil) + end + + it "only updates relat value" do + expect(logger).to receive(:info).with(/lettings log \d+'s relat2 value has been set to R/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq("F") + expect(lettings_log.relat2).to eq("R") + expect(lettings_log.values_updated_at).not_to be_nil + end + end + + context "when the lettings log has relat value" do + before do + lettings_log.update!(sex2: nil, relat2: "X", details_known_2: 0, values_updated_at: nil) + end + + it "only updates sex value" do + expect(logger).to receive(:info).with(/lettings log \d+'s sex2 value has been set to R/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq("R") + expect(lettings_log.relat2).to eq("X") + expect(lettings_log.values_updated_at).not_to be_nil + end + end + + context "when the lettings log has no hhmemb value" do + before do + lettings_log.update!(sex2: nil, relat2: nil, hhmemb: nil, values_updated_at: nil) + end + + it "does not update the lettings_log sex and relat values" do + expect(logger).to receive(:info).with(/lettings log \d+ has no hhmemb value, skipping update/) + import_service.send(:update_sex_and_relat, lettings_log_xml) + lettings_log.reload + expect(lettings_log.sex2).to eq(nil) + expect(lettings_log.relat2).to eq(nil) + expect(lettings_log.values_updated_at).to be_nil + end + end + end end