7 changed files with 118 additions and 14 deletions
@ -0,0 +1,23 @@ |
|||||||
|
namespace :correct_addresses do |
||||||
|
# rubocop:disable Lint/ConstantDefinitionInBlock |
||||||
|
MISSING_ADDRESSES_THRESHOLD = 50 |
||||||
|
# rubocop:enable Lint/ConstantDefinitionInBlock |
||||||
|
|
||||||
|
desc "Send missing addresses csv" |
||||||
|
task :send_missing_addresses_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, address_line1: nil, town_or_city: nil, uprn_known: [0, nil]) |
||||||
|
.where.not(old_form_id: 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") |
||||||
|
Rails.logger.info("Sending missing addresses CSV for #{organisation.name} to #{users_to_contact.map(&:email).join(', ')}") |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
@ -0,0 +1,73 @@ |
|||||||
|
require "rails_helper" |
||||||
|
require "rake" |
||||||
|
|
||||||
|
RSpec.describe "emails" do |
||||||
|
describe ":send_missing_addresses_csv", type: :task do |
||||||
|
subject(:task) { Rake::Task["correct_addresses:send_missing_addresses_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 addresses 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: nil, 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") |
||||||
|
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 addresses CSV for test organisation to data_coordinator1@example.com, data_coordinator2@example.com") |
||||||
|
task.invoke |
||||||
|
end |
||||||
|
end |
||||||
|
|
||||||
|
context "when org has 5 missing addresses 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: nil, 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") |
||||||
|
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 addresses 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 addresses" do |
||||||
|
before do |
||||||
|
create_list(:lettings_log, 3, :imported, startdate: Time.zone.local(2023, 9, 9), address_line1: nil, 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: nil, 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 addresses than threshold amount" do |
||||||
|
expect { task.invoke }.not_to enqueue_job(EmailMissingAddressesCsvJob) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
Loading…
Reference in new issue