Browse Source

Create example report

pull/1892/head
Kat 3 years ago
parent
commit
d77aed4cf1
  1. 40
      app/services/imports/import_report_service.rb
  2. 16
      spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv
  3. 2
      spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv
  4. 19
      spec/services/imports/import_report_service_spec.rb

40
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

16
spec/fixtures/files/imported_lettings_logs_missing_answers_examples.csv vendored

@ -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
1 Missing answers Organisation ID Log ID Old Log ID
2 age1_known {org_id0} {id0} age1_known_0
3 age1_known {org_id1} {id1} age1_known_1
4 age1_known {org_id2} {id2} age1_known_2
5 age1_known {org_id3} {id3} age1_known_3
6 age1_known {org_id4} {id4} age1_known_4
7 age1_known {org_id5} {id5} age1_known_5
8 age1_known {org_id6} {id6} age1_known_6
9 age1_known {org_id7} {id7} age1_known_7
10 age1_known {org_id8} {id8} age1_known_8
11 age1_known {org_id9} {id9} age1_known_9
12 beds {org_id2_0} {id2_0} beds_0
13 beds {org_id2_1} {id2_1} beds_1
14 beds {org_id2_2} {id2_2} beds_2
15 beds {org_id2_3} {id2_3} beds_3
16 beds, age1_known {org_id} {id} beds_and_age

2
spec/fixtures/files/imported_lettings_logs_missing_answers_report.csv vendored

@ -1,2 +1,4 @@
Missing answers,Total number of affected logs
age1_known,11
beds,4
"beds, age1_known",1

1 Missing answers Total number of affected logs
2 age1_known 11
3 beds 4
4 beds, age1_known 1

19
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

Loading…
Cancel
Save