diff --git a/app/jobs/email_missing_addresses_csv_job.rb b/app/jobs/email_missing_addresses_csv_job.rb new file mode 100644 index 000000000..02ccee8c2 --- /dev/null +++ b/app/jobs/email_missing_addresses_csv_job.rb @@ -0,0 +1,27 @@ +class EmailMissingAddressesCsvJob < ApplicationJob + queue_as :default + + BYTE_ORDER_MARK = "\uFEFF".freeze # Required to ensure Excel always reads CSV as UTF-8 + + def perform(users, organisation, log_type) + case log_type + when "lettings" + csv_string = Csv::MissingAddressesCsvService.new(organisation:).create_missing_lettings_addresses_csv + filename = "#{['missing-lettings-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" + email_method = :send_missing_lettings_addresses_csv_download_mail + when "sales" + csv_string = Csv::MissingAddressesCsvService.new(organisation:).create_missing_sales_addresses_csv + filename = "#{['missing-sales-logs-addresses', organisation.name, Time.zone.now].compact.join('-')}.csv" + email_method = :send_missing_sales_addresses_csv_download_mail + end + + storage_service = Storage::S3Service.new(Configuration::EnvConfigurationService.new, ENV["CSV_DOWNLOAD_PAAS_INSTANCE"]) + storage_service.write_file(filename, BYTE_ORDER_MARK + csv_string) + + url = storage_service.get_presigned_url(filename, nil) + + users.each do |user| + CsvDownloadMailer.new.send(email_method, user, url) + end + end +end diff --git a/app/mailers/csv_download_mailer.rb b/app/mailers/csv_download_mailer.rb index 619d5e922..db5957d23 100644 --- a/app/mailers/csv_download_mailer.rb +++ b/app/mailers/csv_download_mailer.rb @@ -8,4 +8,8 @@ class CsvDownloadMailer < NotifyMailer { name: user.name, link:, duration: ActiveSupport::Duration.build(duration).inspect }, ) end + + def send_missing_lettings_addresses_csv_download_mail(user, link); end + + def send_missing_sales_addresses_csv_download_mail(user, link); end end diff --git a/app/services/csv/missing_addresses_csv_service.rb b/app/services/csv/missing_addresses_csv_service.rb new file mode 100644 index 000000000..c052f1594 --- /dev/null +++ b/app/services/csv/missing_addresses_csv_service.rb @@ -0,0 +1,9 @@ +module Csv + class MissingAddressesCsvService + def initialize(organisation); end + + def create_missing_lettings_addresses_csv; end + + def create_missing_sales_addresses_csv; end + end +end diff --git a/spec/jobs/email_missing_addresses_csv_job_spec.rb b/spec/jobs/email_missing_addresses_csv_job_spec.rb new file mode 100644 index 000000000..e5e344c97 --- /dev/null +++ b/spec/jobs/email_missing_addresses_csv_job_spec.rb @@ -0,0 +1,66 @@ +require "rails_helper" + +describe EmailMissingAddressesCsvJob do + include Helpers + + test_url = :test_url + + let(:job) { described_class.new } + let(:storage_service) { instance_double(Storage::S3Service) } + let(:mailer) { instance_double(CsvDownloadMailer) } + let(:missing_addresses_csv_service) { instance_double(Csv::MissingAddressesCsvService) } + let(:organisation) { build(:organisation) } + let(:users) { create_list(:user, 2) } + + before do + allow(Storage::S3Service).to receive(:new).and_return(storage_service) + allow(storage_service).to receive(:write_file) + allow(storage_service).to receive(:get_presigned_url).and_return(test_url) + + allow(Csv::MissingAddressesCsvService).to receive(:new).and_return(missing_addresses_csv_service) + allow(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv).and_return("") + allow(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv).and_return("") + + allow(CsvDownloadMailer).to receive(:new).and_return(mailer) + allow(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail) + allow(mailer).to receive(:send_missing_sales_addresses_csv_download_mail) + end + + context "when sending missing lettings logs csv" do + it "uses an appropriate filename in S3" do + expect(storage_service).to receive(:write_file).with(/missing-lettings-logs-addresses-#{organisation.name}-.*\.csv/, anything) + job.perform(users, organisation, "lettings") + end + + it "creates a MissingAddressesCsvService with the correct organisation and calls create missing lettings logs adresses csv" do + expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation:) + expect(missing_addresses_csv_service).to receive(:create_missing_lettings_addresses_csv) + job.perform(users, organisation, "lettings") + end + + it "sends emails to all the provided users" do + expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[0], test_url) + expect(mailer).to receive(:send_missing_lettings_addresses_csv_download_mail).with(users[1], test_url) + job.perform(users, organisation, "lettings") + end + end + + context "when sending missing sales logs csv" do + it "uses an appropriate filename in S3" do + expect(storage_service).to receive(:write_file).with(/missing-sales-logs-addresses-#{organisation.name}-.*\.csv/, anything) + job.perform(users, organisation, "sales") + end + + it "creates a MissingAddressesCsvService with the correct organisation and calls create missing sales logs adresses csv" do + expect(Csv::MissingAddressesCsvService).to receive(:new).with(organisation:) + expect(missing_addresses_csv_service).to receive(:create_missing_sales_addresses_csv) + job.perform(users, organisation, "sales") + end + + it "sends emails to all the provided users" do + expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[0], test_url) + expect(mailer).to receive(:send_missing_sales_addresses_csv_download_mail).with(users[1], test_url) + job.perform(users, organisation, "sales") + end + end +end