From 8986896288b5d4b88b9f8587e5edc89a7d865266 Mon Sep 17 00:00:00 2001 From: baarkerlounger <5101747+baarkerlounger@users.noreply.github.com> Date: Wed, 15 Jun 2022 15:36:23 +0100 Subject: [PATCH] Fix lettings allocation (cbl, chr, cap) import (#665) * Fix lettings allocation (cbl, chr, cap) import * Add task to fix existing logs * Map value on export * Run workflow on push to PR --- .github/workflows/staging_pipeline.yml | 1 + .../exports/case_log_export_service.rb | 4 + .../imports/case_logs_field_import_service.rb | 38 ++++++++ .../imports/case_logs_import_service.rb | 15 ++- spec/fixtures/exports/case_logs.csv | 2 +- spec/fixtures/exports/case_logs.xml | 2 +- .../166fc004-392e-47a8-acb8-1c018734882b.xml | 4 +- .../5ybz29dj-l33t-k1l0-hj86-n4k4ma77xkcd.xml | 2 +- .../893ufj2s-lq77-42m4-rty6-ej09gh585uy1.xml | 2 +- .../case_logs_field_import_service_spec.rb | 91 +++++++++++++++++++ 10 files changed, 152 insertions(+), 9 deletions(-) diff --git a/.github/workflows/staging_pipeline.yml b/.github/workflows/staging_pipeline.yml index b9ab15e17..c4a8c0a43 100644 --- a/.github/workflows/staging_pipeline.yml +++ b/.github/workflows/staging_pipeline.yml @@ -8,6 +8,7 @@ on: types: - opened - ready_for_review + - synchronize workflow_dispatch: defaults: diff --git a/app/services/exports/case_log_export_service.rb b/app/services/exports/case_log_export_service.rb index 078e4a879..d2890d455 100644 --- a/app/services/exports/case_log_export_service.rb +++ b/app/services/exports/case_log_export_service.rb @@ -182,6 +182,10 @@ module Exports attribute_hash["tenancycode"] = attribute_hash["tenant_code"] attribute_hash["ppcodenk"] = attribute_hash["previous_postcode_known"] + attribute_hash["cbl"] = 2 if attribute_hash["cbl"]&.zero? + attribute_hash["cap"] = 2 if attribute_hash["cap"]&.zero? + attribute_hash["chr"] = 2 if attribute_hash["chr"]&.zero? + # Age refused (1..8).each do |index| attribute_hash["age#{index}"] = -9 if attribute_hash["age#{index}_known"] == 1 diff --git a/app/services/imports/case_logs_field_import_service.rb b/app/services/imports/case_logs_field_import_service.rb index e1c88454c..30871af56 100644 --- a/app/services/imports/case_logs_field_import_service.rb +++ b/app/services/imports/case_logs_field_import_service.rb @@ -6,6 +6,8 @@ module Imports import_from(folder, :update_tenant_code) when "major_repairs" import_from(folder, :update_major_repairs) + when "lettings_allocation" + import_from(folder, :update_lettings_allocation) else raise "Updating #{field} is not supported by the field import service" end @@ -13,6 +15,32 @@ module Imports private + def update_lettings_allocation(xml_doc) + old_id = field_value(xml_doc, "meta", "document-id") + previous_status = field_value(xml_doc, "meta", "status") + record = CaseLog.find_by(old_id:) + + if record.present? && previous_status.include?("submitted") + cbl = unsafe_string_as_integer(xml_doc, "Q15CBL") + chr = unsafe_string_as_integer(xml_doc, "Q15CHR") + cap = unsafe_string_as_integer(xml_doc, "Q15CAP") + if cbl == 2 && record.cbl == 1 + record.update!(cbl: 0) + @logger.info("Case Log #{record.id}'s cbl value has been updated'") + end + if chr == 2 && record.chr == 1 + record.update!(chr: 0) + @logger.info("Case Log #{record.id}'s chr value has been updated'") + end + if cap == 2 && record.cap == 1 + record.update!(cap: 0) + @logger.info("Case Log #{record.id}'s cap value has been updated'") + end + else + @logger.warn("Could not find record matching legacy ID #{old_id}") + end + end + def update_major_repairs(xml_doc) old_id = field_value(xml_doc, "meta", "document-id") record = CaseLog.find_by(old_id:) @@ -67,5 +95,15 @@ module Imports str = field_value(xml_doc, "xmlns", attribute) str.presence end + + # Unsafe: A string that has more than just the integer value + def unsafe_string_as_integer(xml_doc, attribute) + str = string_or_nil(xml_doc, attribute) + if str.nil? + nil + else + str.to_i + end + end end end diff --git a/app/services/imports/case_logs_import_service.rb b/app/services/imports/case_logs_import_service.rb index 3b596c863..7af00b12c 100644 --- a/app/services/imports/case_logs_import_service.rb +++ b/app/services/imports/case_logs_import_service.rb @@ -123,9 +123,9 @@ module Imports attributes["rp_hardship"] = unsafe_string_as_integer(xml_doc, "Q14b4").present? ? 1 : nil attributes["rp_dontknow"] = unsafe_string_as_integer(xml_doc, "Q14b5").present? ? 1 : nil - attributes["cbl"] = unsafe_string_as_integer(xml_doc, "Q15CBL").present? ? 1 : nil - attributes["chr"] = unsafe_string_as_integer(xml_doc, "Q15CHR").present? ? 1 : nil - attributes["cap"] = unsafe_string_as_integer(xml_doc, "Q15CAP").present? ? 1 : nil + attributes["cbl"] = allocation_system(unsafe_string_as_integer(xml_doc, "Q15CBL")) + attributes["chr"] = allocation_system(unsafe_string_as_integer(xml_doc, "Q15CHR")) + attributes["cap"] = allocation_system(unsafe_string_as_integer(xml_doc, "Q15CAP")) attributes["referral"] = unsafe_string_as_integer(xml_doc, "Q16") attributes["period"] = unsafe_string_as_integer(xml_doc, "Q17") @@ -553,6 +553,15 @@ module Imports end end + def allocation_system(value) + case value + when 1 + 1 + when 2 + 0 + end + end + def apply_date_consistency!(attributes) return if attributes["voiddate"].nil? || attributes["startdate"].nil? diff --git a/spec/fixtures/exports/case_logs.csv b/spec/fixtures/exports/case_logs.csv index 5d334bcfb..1558c7ff1 100644 --- a/spec/fixtures/exports/case_logs.csv +++ b/spec/fixtures/exports/case_logs.csv @@ -1,2 +1,2 @@ status,age1,sex1,ethnic,national,prevten,ecstat1,hhmemb,age2,sex2,ecstat2,age3,sex3,ecstat3,age4,sex4,ecstat4,age5,sex5,ecstat5,age6,sex6,ecstat6,age7,sex7,ecstat7,age8,sex8,ecstat8,homeless,underoccupation_benefitcap,leftreg,reservist,illness,preg_occ,startertenancy,tenancylength,tenancy,ppostcode_full,rsnvac,unittype_gn,beds,offered,wchair,earnings,incfreq,benefits,period,layear,waityear,postcode_full,reasonpref,cbl,chr,cap,reasonother,housingneeds_a,housingneeds_b,housingneeds_c,housingneeds_f,housingneeds_g,housingneeds_h,illness_type_1,illness_type_2,illness_type_3,illness_type_4,illness_type_8,illness_type_5,illness_type_6,illness_type_7,illness_type_9,illness_type_10,rp_homeless,rp_insan_unsat,rp_medwel,rp_hardship,rp_dontknow,tenancyother,irproduct_other,reason,propcode,la,prevloc,hb,hbrentshortfall,mrcdate,incref,startdate,armedforces,unitletas,builtype,voiddate,renttype,needstype,lettype,totchild,totelder,totadult,nocharge,referral,brent,scharge,pscharge,supcharg,tcharge,tshortfall,chcharge,has_benefits,renewal,wrent,wscharge,wpschrge,wsupchrg,wtcharge,wtshortfall,refused,housingneeds,wchchrg,newprop,relat2,relat3,relat4,relat5,relat6,relat7,relat8,lar,irproduct,joint,shelteredaccom,form,owningorgid,owningorgname,hcnum,maningorgid,maningorgname,manhcnum,createddate,uploaddate,tenancycode,ppcodenk -2,35,F,2,4,6,0,2,32,M,6,,,,,,,,,,,,,,,,,,,1,0,1,0,1,2,0,5,1,SE26RT,6,7,3,2,1,68,1,1,2,2,1,NW15TY,1,1,1,0,,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,,,4,123,E09000003,E07000105,6,1,2020-05-05 10:36:49 UTC,0,2022-02-02 10:36:49 UTC,1,2,1,2019-11-03 00:00:00 UTC,2,1,7,0,0,2,0,,200.0,50.0,40.0,35.0,325.0,12.0,,1,0,100.0,25.0,20.0,17.5,162.5,6.0,0,1,,2,P,,,,,,,,,,0,{id},{owning_org_id},DLUHC,1234,{managing_org_id},DLUHC,1234,2022-02-08 16:52:15 UTC,2022-02-08 16:52:15 UTC,BZ737,1 +2,35,F,2,4,6,0,2,32,M,6,,,,,,,,,,,,,,,,,,,1,0,1,0,1,2,0,5,1,SE26RT,6,7,3,2,1,68,1,1,2,2,1,NW15TY,1,1,1,2,,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,,,4,123,E09000003,E07000105,6,1,2020-05-05 10:36:49 UTC,0,2022-02-02 10:36:49 UTC,1,2,1,2019-11-03 00:00:00 UTC,2,1,7,0,0,2,0,,200.0,50.0,40.0,35.0,325.0,12.0,,1,0,100.0,25.0,20.0,17.5,162.5,6.0,0,1,,2,P,,,,,,,,,,0,{id},{owning_org_id},DLUHC,1234,{managing_org_id},DLUHC,1234,2022-02-08 16:52:15 UTC,2022-02-08 16:52:15 UTC,BZ737,1 diff --git a/spec/fixtures/exports/case_logs.xml b/spec/fixtures/exports/case_logs.xml index 3e12ec610..3c06ac5c1 100644 --- a/spec/fixtures/exports/case_logs.xml +++ b/spec/fixtures/exports/case_logs.xml @@ -55,7 +55,7 @@ 1 1 1 - 0 + 2 1 0 diff --git a/spec/fixtures/softwire_imports/case_logs/166fc004-392e-47a8-acb8-1c018734882b.xml b/spec/fixtures/softwire_imports/case_logs/166fc004-392e-47a8-acb8-1c018734882b.xml index 631f41cae..0ddca74c3 100644 --- a/spec/fixtures/softwire_imports/case_logs/166fc004-392e-47a8-acb8-1c018734882b.xml +++ b/spec/fixtures/softwire_imports/case_logs/166fc004-392e-47a8-acb8-1c018734882b.xml @@ -2,7 +2,7 @@ 2021-CORE-IR-GN 166fc004-392e-47a8-acb8-1c018734882b - e29c492473446dca4d50224f2bb7cf965a261d6f + c3061a2e6ea0b702e6f6210d5c52d2a92612d2aa 7c5bd5fb549c09a2c55d7cb90d7ba84927e64618 7c5bd5fb549c09a2c55d7cb90d7ba84927e64618 2022-04-12T14:10:59.953121Z @@ -133,7 +133,7 @@ 2 No 2 No - 2 No + 1 Yes 10 Other social landlord diff --git a/spec/fixtures/softwire_imports/case_logs/5ybz29dj-l33t-k1l0-hj86-n4k4ma77xkcd.xml b/spec/fixtures/softwire_imports/case_logs/5ybz29dj-l33t-k1l0-hj86-n4k4ma77xkcd.xml index 2531314dd..0e014e2a3 100644 --- a/spec/fixtures/softwire_imports/case_logs/5ybz29dj-l33t-k1l0-hj86-n4k4ma77xkcd.xml +++ b/spec/fixtures/softwire_imports/case_logs/5ybz29dj-l33t-k1l0-hj86-n4k4ma77xkcd.xml @@ -131,7 +131,7 @@ - 2 No + 1 Yes 2 No 2 No diff --git a/spec/fixtures/softwire_imports/case_logs/893ufj2s-lq77-42m4-rty6-ej09gh585uy1.xml b/spec/fixtures/softwire_imports/case_logs/893ufj2s-lq77-42m4-rty6-ej09gh585uy1.xml index f01bb1baa..3f14dbf1f 100644 --- a/spec/fixtures/softwire_imports/case_logs/893ufj2s-lq77-42m4-rty6-ej09gh585uy1.xml +++ b/spec/fixtures/softwire_imports/case_logs/893ufj2s-lq77-42m4-rty6-ej09gh585uy1.xml @@ -132,7 +132,7 @@ 2 No - 2 No + 1 Yes 2 No diff --git a/spec/services/imports/case_logs_field_import_service_spec.rb b/spec/services/imports/case_logs_field_import_service_spec.rb index 3233d6706..8d3062bb0 100644 --- a/spec/services/imports/case_logs_field_import_service_spec.rb +++ b/spec/services/imports/case_logs_field_import_service_spec.rb @@ -74,6 +74,97 @@ RSpec.describe Imports::CaseLogsFieldImportService do end end + context "when updating letings allocation values" do + let(:field) { "lettings_allocation" } + let(:case_log) { CaseLog.find_by(old_id: case_log_id) } + + before do + Imports::CaseLogsImportService.new(storage_service, logger).create_logs(fixture_directory) + case_log_file.rewind + end + + context "when cbl" do + let(:case_log_id) { "166fc004-392e-47a8-acb8-1c018734882b" } + + context "when it was incorrectly set" do + before do + case_log.update!(cbl: 1) + end + + it "updates the value" do + expect(logger).to receive(:info).with(/Case Log \d+'s cbl value has been updated/) + expect { import_service.send(:update_field, field, remote_folder) } + .to(change { case_log.reload.cbl }.from(1).to(0)) + end + end + + context "when it was correctly set" do + before do + case_log.update!(cbl: 0) + end + + it "does not update the value" do + expect { import_service.send(:update_field, field, remote_folder) } + .not_to(change { case_log.reload.cbl }) + end + end + end + + context "when chr" do + let(:case_log_id) { "166fc004-392e-47a8-acb8-1c018734882b" } + + context "when it was incorrectly set" do + before do + case_log.update!(chr: 1) + end + + it "updates the value" do + expect(logger).to receive(:info).with(/Case Log \d+'s chr value has been updated/) + expect { import_service.send(:update_field, field, remote_folder) } + .to(change { case_log.reload.chr }.from(1).to(0)) + end + end + + context "when it was correctly set" do + before do + case_log.update!(chr: 0) + end + + it "does not update the value" do + expect { import_service.send(:update_field, field, remote_folder) } + .not_to(change { case_log.reload.chr }) + end + end + end + + context "when cap" do + let(:case_log_id) { "0ead17cb-1668-442d-898c-0d52879ff592" } + + context "when it was incorrectly set" do + before do + case_log.update!(cap: 1) + end + + it "updates the value" do + expect(logger).to receive(:info).with(/Case Log \d+'s cap value has been updated/) + expect { import_service.send(:update_field, field, remote_folder) } + .to(change { case_log.reload.cap }.from(1).to(0)) + end + end + + context "when it was correctly set" do + before do + case_log.update!(cap: 0) + end + + it "does not update the value" do + expect { import_service.send(:update_field, field, remote_folder) } + .not_to(change { case_log.reload.cap }) + end + end + end + end + context "when updating major repairs" do let(:field) { "major_repairs" }