diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 3d01c5284..9bbd28a73 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -572,6 +572,10 @@ class LettingsLog < Log is_general_needs? && referral == 4 end + def has_any_person_details?(person_index) + ["sex#{person_index}", "relat#{person_index}", "ecstat#{person_index}"].any? { |field| public_send(field).present? } || public_send("age#{person_index}_known") == 1 + end + private def reset_invalid_unresolved_log_fields! diff --git a/app/services/imports/lettings_logs_field_import_service.rb b/app/services/imports/lettings_logs_field_import_service.rb index d63cc3354..66cc87de4 100644 --- a/app/services/imports/lettings_logs_field_import_service.rb +++ b/app/services/imports/lettings_logs_field_import_service.rb @@ -24,6 +24,8 @@ module Imports import_from(folder, :update_sex_and_relat) when "general_needs_referral" import_from(folder, :update_general_needs_referral) + when "person_details" + import_from(folder, :update_person_details) else raise "Updating #{field} is not supported by the field import service" end @@ -299,5 +301,46 @@ module Imports record.update!(referral: 4, referral_value_check: 0, values_updated_at: Time.zone.now) @logger.info("lettings log #{record.id}'s referral value has been set to 4") end + + def update_person_details(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} person 2 details are not known, skipping update") if record.details_known_2 == 1 + return @logger.info("lettings log #{record.id} has details for person 2, skipping update") if record.has_any_person_details?(2) + + record.age2_known = record.age3_known + record.age2 = record.age3 + record.sex2 = record.sex3 + record.ecstat2 = record.ecstat3 + record.relat2 = record.relat3 + @logger.info("lettings log #{record.id}'s person 3 details moved to person 2 details") + + record.age3 = safe_string_as_integer(xml_doc, "P4Age") + record.age3_known = age_known(xml_doc, 4) + record.sex3 = sex(xml_doc, 4) + record.ecstat3 = unsafe_string_as_integer(xml_doc, "P4Eco") + record.relat3 = relat(xml_doc, 4) + @logger.info("lettings log #{record.id}, reimported person 3 details") + + record.values_updated_at = Time.zone.now + record.save! + end + + def age_known(xml_doc, person_index) + age_refused = string_or_nil(xml_doc, "P#{person_index}AR") + if age_refused.present? + if age_refused.casecmp?("AGE_REFUSED") || age_refused.casecmp?("No") + return 1 # No + else + return 0 # Yes + end + end + 0 + end end end diff --git a/lib/tasks/data_import_field.rake b/lib/tasks/data_import_field.rake index f9879b4c6..1ec9a5387 100644 --- a/lib/tasks/data_import_field.rake +++ b/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", "created_by", "sex_and_relat", "general_needs_referral" + when "tenancycode", "major_repairs", "lettings_allocation", "offered", "address", "reason", "person_details" 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) diff --git a/spec/lib/tasks/data_import_field_spec.rb b/spec/lib/tasks/data_import_field_spec.rb index 6973e0762..b84cb9d23 100644 --- a/spec/lib/tasks/data_import_field_spec.rb +++ b/spec/lib/tasks/data_import_field_spec.rb @@ -164,6 +164,18 @@ describe "data_import_field imports" do end end + context "and we update the person_details field" do + let(:field) { "person_details" } + + 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 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 9cc3ddfe5..4b9618cd5 100644 --- a/spec/services/imports/lettings_logs_field_import_service_spec.rb +++ b/spec/services/imports/lettings_logs_field_import_service_spec.rb @@ -1021,4 +1021,74 @@ RSpec.describe Imports::LettingsLogsFieldImportService do end end end + + context "when updating person_details" do + let(:field) { "person_details" } + 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.update!(values_updated_at: nil) + lettings_log_xml.at_xpath("//xmlns:P4Age").content = 7 + lettings_log_xml.at_xpath("//xmlns:P4Sex").content = "Male" + lettings_log_xml.at_xpath("//xmlns:P4Rel").content = "Child" + lettings_log_xml.at_xpath("//xmlns:P4Eco").content = "9) Child under 16" + end + + context "when the lettings log has no details for person 2" do + before do + lettings_log.update(details_known_2: 0, age2_known: nil, age2: nil, sex2: nil, ecstat2: nil, relat2: nil, hhmemb: 3, + details_known_3: 0, age3_known: 0, age3: 19, sex3: "F", ecstat3: 10, relat3: "X") + end + + it "moves the details of person 3 to person 2 and imports missing person 3 values" do + expect(logger).to receive(:info).with(/lettings log \d+'s person 3 details moved to person 2 details/) + expect(logger).to receive(:info).with(/lettings log \d+, reimported person 3 details/) + import_service.send(:update_person_details, lettings_log_xml) + lettings_log.reload + expect(lettings_log.age2_known).to eq(0) + expect(lettings_log.age2).to eq(19) + expect(lettings_log.sex2).to eq("F") + expect(lettings_log.ecstat2).to eq(10) + expect(lettings_log.relat2).to eq("X") + expect(lettings_log.age3_known).to eq(0) + expect(lettings_log.age3).to eq(7) + expect(lettings_log.sex3).to eq("M") + expect(lettings_log.ecstat3).to eq(9) + expect(lettings_log.relat3).to eq("C") + expect(lettings_log.values_updated_at).not_to be_nil + end + end + + context "when the lettings log has details for person 2" do + let(:lettings_log) { LettingsLog.find_by(old_id: lettings_log_id) } + + before do + lettings_log.update(details_known_2: 0, age2: 22) + end + + it "does not update the lettings_log person details" do + expect(logger).to receive(:info).with(/lettings log \d+ has details for person 2, skipping update/) + import_service.send(:update_person_details, lettings_log_xml) + lettings_log.reload + expect(lettings_log.values_updated_at).to be_nil + end + end + + context "when the person 2 details are not known" do + let(:lettings_log) { LettingsLog.find_by(old_id: lettings_log_id) } + + before do + lettings_log.update(details_known_2: 1) + end + + it "does not update the lettings_log person details" do + expect(logger).to receive(:info).with(/lettings log \d+ person 2 details are not known, skipping update/) + import_service.send(:update_person_details, lettings_log_xml) + lettings_log.reload + expect(lettings_log.values_updated_at).to be_nil + end + end + end end