From d77aed4cf1d476b613cd2851dd31b3ed9f5c89bb Mon Sep 17 00:00:00 2001 From: Kat Date: Wed, 6 Sep 2023 14:19:20 +0100 Subject: [PATCH] Create example report --- app/services/imports/import_report_service.rb | 40 +++++++++++++------ ...lettings_logs_missing_answers_examples.csv | 16 ++++++++ ...d_lettings_logs_missing_answers_report.csv | 2 + .../imports/import_report_service_spec.rb | 19 ++++++++- 4 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv diff --git a/app/services/imports/import_report_service.rb b/app/services/imports/import_report_service.rb index bb512c4d9..10c4fec7e 100644 --- a/app/services/imports/import_report_service.rb +++ b/app/services/imports/import_report_service.rb @@ -87,32 +87,48 @@ module Imports def generate_missing_answers_report(report_suffix) Rails.logger.info("Generating missing imported lettings logs answers report") + unanswered_question_counts = {} + missing_answers_example_sets = {} + + LettingsLog.where.not(old_id: nil).where(status: "in_progress").each do |lettings_log| + applicable_questions = lettings_log.form.subsections.map { |s| s.applicable_questions(lettings_log).select { |q| q.enabled?(lettings_log) } }.flatten + unanswered_questions = applicable_questions.filter { |q| q.unanswered?(lettings_log) }.map(&:id) - lettings_log.optional_fields + + if unanswered_question_counts[unanswered_questions.join(", ")].present? + unanswered_question_counts[unanswered_questions.join(", ")] += 1 + missing_answers_example_sets[unanswered_questions.join(", ")] << { id: lettings_log.id, old_id: lettings_log.old_id, owning_organisation_id: lettings_log.owning_organisation_id } unless unanswered_question_counts[unanswered_questions.join(", ")] > 10 + else + unanswered_question_counts[unanswered_questions.join(", ")] = 1 + missing_answers_example_sets[unanswered_questions.join(", ")] = [{ id: lettings_log.id, old_id: lettings_log.old_id, owning_organisation_id: lettings_log.owning_organisation_id }] + end + end rep = CSV.generate do |report| headers = ["Missing answers", "Total number of affected logs"] report << headers - unanswered_question_counts = {} + unanswered_question_counts.each do |missing_answers, count| + report << [missing_answers, count] + end + end - LettingsLog.where.not(old_id: nil).where(status: "in_progress").each do |lettings_log| - applicable_questions = lettings_log.form.subsections.map { |s| s.applicable_questions(lettings_log).select { |q| q.enabled?(lettings_log) } }.flatten - unanswered_questions = applicable_questions.filter { |q| q.unanswered?(lettings_log) }.map(&:id) - lettings_log.optional_fields + missing_answers_examples = CSV.generate do |report| + headers = ["Missing answers", "Organisation ID", "Log ID", "Old Log ID"] + report << headers - if unanswered_question_counts[unanswered_questions.join(", ")].present? - unanswered_question_counts[unanswered_questions.join(", ")] += 1 - else - unanswered_question_counts[unanswered_questions.join(", ")] = 1 + missing_answers_example_sets.each do |missing_answers, examples| + examples.each do |example| + report << [missing_answers, example[:owning_organisation_id], example[:id], example[:old_id]] end end - - unanswered_question_counts.each do |missing_answers, count| - report << [missing_answers, count] - end end report_name = "MissingAnswersReport_#{report_suffix}.csv" @storage_service.write_file(report_name, BYTE_ORDER_MARK + rep) + examples_report_name = "MissingAnswersExamples_#{report_suffix}.csv" + @storage_service.write_file(examples_report_name, BYTE_ORDER_MARK + missing_answers_examples) + @logger.info("Missing answers report available in s3 import bucket at #{report_name}") end end diff --git a/spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv b/spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv new file mode 100644 index 000000000..4d6da88ab --- /dev/null +++ b/spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv @@ -0,0 +1,16 @@ +Missing answers,Organisation ID,Log ID,Old Log ID +age1_known,{org_id0},{id0},age1_known_0 +age1_known,{org_id1},{id1},age1_known_1 +age1_known,{org_id2},{id2},age1_known_2 +age1_known,{org_id3},{id3},age1_known_3 +age1_known,{org_id4},{id4},age1_known_4 +age1_known,{org_id5},{id5},age1_known_5 +age1_known,{org_id6},{id6},age1_known_6 +age1_known,{org_id7},{id7},age1_known_7 +age1_known,{org_id8},{id8},age1_known_8 +age1_known,{org_id9},{id9},age1_known_9 +beds,{org_id2_0},{id2_0},beds_0 +beds,{org_id2_1},{id2_1},beds_1 +beds,{org_id2_2},{id2_2},beds_2 +beds,{org_id2_3},{id2_3},beds_3 +"beds, age1_known",{org_id},{id},beds_and_age diff --git a/spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv b/spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv index 78e28e1a1..936dc82e0 100644 --- a/spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv +++ b/spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv @@ -1,2 +1,4 @@ Missing answers,Total number of affected logs age1_known,11 +beds,4 +"beds, age1_known",1 diff --git a/spec/services/imports/import_report_service_spec.rb b/spec/services/imports/import_report_service_spec.rb index 3be7297bd..fe7384804 100644 --- a/spec/services/imports/import_report_service_spec.rb +++ b/spec/services/imports/import_report_service_spec.rb @@ -103,17 +103,32 @@ RSpec.describe Imports::ImportReportService do context "when there are in progress imported logs" do let(:institutions_csv) { nil } let(:expected_content) { File.read("spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv") } + let(:expected__answers_examples_content) { File.read("spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv") } before do - create_list(:lettings_log, 11, :completed, age1_known: nil) do |log, _i| - log.old_id = Faker::Name.initials(number: 10) + create_list(:lettings_log, 11, :completed, age1_known: nil) do |log, i| + log.old_id = "age1_known_#{i}" log.save! + expected__answers_examples_content.sub!("{id#{i}}", log.id.to_s) + expected__answers_examples_content.sub!("{org_id#{i}}", log.owning_organisation_id.to_s) end + create_list(:lettings_log, 4, :completed, beds: nil) do |log, i| + log.old_id = "beds_#{i}" + expected__answers_examples_content.sub!("{id2_#{i}}", log.id.to_s) + expected__answers_examples_content.sub!("{org_id2_#{i}}", log.owning_organisation_id.to_s) + log.save! + end + create(:lettings_log, :completed, age1_known: nil, beds: nil, old_id: "beds_and_age") do |log| + expected__answers_examples_content.sub!("{id}", log.id.to_s) + expected__answers_examples_content.sub!("{org_id}", log.owning_organisation_id.to_s) + end + create_list(:lettings_log, 2, :completed, age1_known: nil) end it "generates a csv with expected missing fields" do expect(storage_service).to receive(:write_file).with("MissingAnswersReport_report_suffix.csv", "#{expected_content}") + expect(storage_service).to receive(:write_file).with("MissingAnswersExamples_report_suffix.csv", "#{expected__answers_examples_content}") report_service.generate_missing_answers_report("report_suffix") end