From d9270d1e2caee243da2a696c5c90487cdbd7278f Mon Sep 17 00:00:00 2001 From: Kat Date: Mon, 2 Oct 2023 09:07:42 +0100 Subject: [PATCH] Add send missing town or city csv rake task --- lib/tasks/send_missing_addresses_csv.rake | 20 ++++- .../tasks/send_missing_addresses_csv_spec.rb | 75 ++++++++++++++++++- 2 files changed, 91 insertions(+), 4 deletions(-) diff --git a/lib/tasks/send_missing_addresses_csv.rake b/lib/tasks/send_missing_addresses_csv.rake index ea668a245..e32f0e61f 100644 --- a/lib/tasks/send_missing_addresses_csv.rake +++ b/lib/tasks/send_missing_addresses_csv.rake @@ -16,8 +16,26 @@ namespace :correct_addresses do data_coordinators = organisation.users.where(role: 2).filter_by_active users_to_contact = data_coordinators.any? ? data_coordinators : organisation.users.filter_by_active - EmailMissingAddressesCsvJob.perform_later(users_to_contact.map(&:id), organisation, "lettings") + EmailMissingAddressesCsvJob.perform_later(users_to_contact.map(&:id), organisation, "lettings", "addresses") Rails.logger.info("Sending missing addresses CSV for #{organisation.name} to #{users_to_contact.map(&:email).join(', ')}") end end + + desc "Send missing town or city csv" + task :send_missing_town_or_city_csv, %i[] => :environment do |_task, _args| + Organisation.all.each do |organisation| + impacted_logs = organisation.managed_lettings_logs + .imported + .filter_by_year(2023) + .where(needstype: 1, town_or_city: nil, uprn_known: [0, nil]) + .where.not(old_form_id: nil) + .where.not(address_line1: nil) + next unless impacted_logs.count >= MISSING_ADDRESSES_THRESHOLD + + data_coordinators = organisation.users.where(role: 2).filter_by_active + users_to_contact = data_coordinators.any? ? data_coordinators : organisation.users.filter_by_active + EmailMissingAddressesCsvJob.perform_later(users_to_contact.map(&:id), organisation, "lettings", "town-or-city") + Rails.logger.info("Sending missing town or city CSV for #{organisation.name} to #{users_to_contact.map(&:email).join(', ')}") + end + end end diff --git a/spec/lib/tasks/send_missing_addresses_csv_spec.rb b/spec/lib/tasks/send_missing_addresses_csv_spec.rb index 4f28cdec7..6e73e5207 100644 --- a/spec/lib/tasks/send_missing_addresses_csv_spec.rb +++ b/spec/lib/tasks/send_missing_addresses_csv_spec.rb @@ -1,7 +1,7 @@ require "rails_helper" require "rake" -RSpec.describe "emails" do +RSpec.describe "correct_addresses" do describe ":send_missing_addresses_csv", type: :task do subject(:task) { Rake::Task["correct_addresses:send_missing_addresses_csv"] } @@ -29,7 +29,7 @@ RSpec.describe "emails" do end it "enqueues the job with correct organisations" do - expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings") + expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings", "addresses") end it "prints out the jobs enqueued" do @@ -48,7 +48,7 @@ RSpec.describe "emails" do end it "enqueues the job with correct organisations" do - expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings") + expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", "addresses") end it "prints out the jobs enqueued" do @@ -70,4 +70,73 @@ RSpec.describe "emails" do end end end + + describe ":send_missing_town_or_city_csv", type: :task do + subject(:task) { Rake::Task["correct_addresses:send_missing_town_or_city_csv"] } + + before do + organisation.users.destroy_all + Rake.application.rake_require("tasks/send_missing_addresses_csv") + Rake::Task.define_task(:environment) + task.reenable + end + + context "when the rake task is run" do + let(:organisation) { create(:organisation, name: "test organisation") } + + before do + stub_const("MISSING_ADDRESSES_THRESHOLD", 5) + end + + context "when org has more than 5 missing town_or_city and data coordinators" do + let!(:data_coordinator) { create(:user, :data_coordinator, organisation:, email: "data_coordinator1@example.com") } + let!(:data_coordinator2) { create(:user, :data_coordinator, organisation:, email: "data_coordinator2@example.com") } + + before do + create(:user, :data_provider, organisation:, email: "data_provider1@example.com") + create_list(:lettings_log, 7, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, needstype: 1, old_form_id: "form_1", owning_organisation: organisation, managing_organisation: organisation, created_by: organisation.users.first) + end + + it "enqueues the job with correct organisations" do + expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_coordinator.id, data_coordinator2.id), organisation, "lettings", "town-or-city") + end + + it "prints out the jobs enqueued" do + expect(Rails.logger).to receive(:info).with(nil) + expect(Rails.logger).to receive(:info).with("Sending missing town or city CSV for test organisation to data_coordinator1@example.com, data_coordinator2@example.com") + task.invoke + end + end + + context "when org has 5 missing town or city and data providers only" do + let!(:data_provider) { create(:user, :data_provider, organisation:, email: "data_provider3@example.com") } + let!(:data_provider2) { create(:user, :data_provider, organisation:, email: "data_provider4@example.com") } + + before do + create_list(:lettings_log, 5, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "exists", town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, created_by: organisation.users.first) + end + + it "enqueues the job with correct organisations" do + expect { task.invoke }.to enqueue_job(EmailMissingAddressesCsvJob).with(include(data_provider.id, data_provider2.id), organisation, "lettings", "town-or-city") + end + + it "prints out the jobs enqueued" do + expect(Rails.logger).to receive(:info).with(nil) + expect(Rails.logger).to receive(:info).with("Sending missing town or city CSV for test organisation to data_provider3@example.com, data_provider4@example.com") + task.invoke + end + end + + context "when org has less than 5 missing town or city" do + before do + create_list(:lettings_log, 3, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "address", town_or_city: nil, needstype: 1, old_form_id: "form_2", owning_organisation: organisation, managing_organisation: organisation, created_by: organisation.users.first) + create_list(:lettings_log, 2, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: "address", needstype: 1, owning_organisation: organisation, managing_organisation: organisation, created_by: organisation.users.first) + end + + it "does not enqueue the job with organisations that is missing less town or city data than threshold amount" do + expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) + end + end + end + end end