From 80ad166fd9995fcd546a8dd41c81bb25990f7bbc Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Sat, 9 Sep 2023 00:43:32 +0300 Subject: [PATCH] automatically send emails when all parties completed the form --- .../submissions_download_controller.rb | 6 +++- ...nerate_submitter_result_attachments_job.rb | 7 ---- app/jobs/process_submitter_completion_job.rb | 32 +++++++++++++++++++ app/mailers/submitter_mailer.rb | 23 +++++++++---- app/models/account_config.rb | 6 ++-- app/models/submitter.rb | 8 +++++ .../submitter_mailer/completed_email.html.erb | 2 +- lib/replace_email_variables.rb | 32 ++++++++++++------- lib/submitters/submit_values.rb | 14 ++------ 9 files changed, 87 insertions(+), 43 deletions(-) delete mode 100644 app/jobs/generate_submitter_result_attachments_job.rb create mode 100644 app/jobs/process_submitter_completion_job.rb diff --git a/app/controllers/submissions_download_controller.rb b/app/controllers/submissions_download_controller.rb index 21a6076c..d742e33c 100644 --- a/app/controllers/submissions_download_controller.rb +++ b/app/controllers/submissions_download_controller.rb @@ -8,8 +8,12 @@ class SubmissionsDownloadController < ApplicationController Submissions::EnsureResultGenerated.call(submitter) + last_submitter = submitter.submission.submitters.order(:completed_at).last + + Submissions::EnsureResultGenerated.call(last_submitter) + urls = - Submitters.select_attachments_for_download(submitter).map do |attachment| + Submitters.select_attachments_for_download(last_submitter).map do |attachment| helpers.rails_blob_url(attachment) end diff --git a/app/jobs/generate_submitter_result_attachments_job.rb b/app/jobs/generate_submitter_result_attachments_job.rb deleted file mode 100644 index b250b5d9..00000000 --- a/app/jobs/generate_submitter_result_attachments_job.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -class GenerateSubmitterResultAttachmentsJob < ApplicationJob - def perform(submitter) - Submissions::EnsureResultGenerated.call(submitter) - end -end diff --git a/app/jobs/process_submitter_completion_job.rb b/app/jobs/process_submitter_completion_job.rb new file mode 100644 index 00000000..d7db2e99 --- /dev/null +++ b/app/jobs/process_submitter_completion_job.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +class ProcessSubmitterCompletionJob < ApplicationJob + def perform(submitter) + is_all_completed = !submitter.submission.submitters.exists?(completed_at: nil) + + Submissions::EnsureResultGenerated.call(submitter) + + if submitter.account.encrypted_configs.exists?(key: EncryptedConfig::WEBHOOK_URL_KEY) + SendWebhookRequestJob.perform_later(submitter) + end + + return unless is_all_completed + return if submitter.completed_at != submitter.submission.submitters.maximum(:completed_at) + + enqueue_emails(submitter) + end + + def enqueue_emails(submitter) + user = submitter.submission.created_by_user || submitter.template.author + + if submitter.template.account.users.exists?(id: user.id) + bcc = submitter.submission.template.account.account_configs.find_by(key: 'bcc_emails')&.value + + SubmitterMailer.completed_email(submitter, user, bcc:).deliver_later! + end + + to = submitter.submission.submitters.order(:completed_at).select(&:email?).map(&:friendly_name).join(', ') + + SubmitterMailer.documents_copy_email(submitter, to:).deliver_later! + end +end diff --git a/app/mailers/submitter_mailer.rb b/app/mailers/submitter_mailer.rb index 764422d9..4c853a27 100644 --- a/app/mailers/submitter_mailer.rb +++ b/app/mailers/submitter_mailer.rb @@ -17,19 +17,28 @@ class SubmitterMailer < ApplicationMailer 'You have been invited to submit a form' end - mail(to: @submitter.email, + mail(to: @submitter.friendly_name, from: from_address_for_submitter(submitter), subject:, - reply_to: submitter.submission.created_by_user&.friendly_name) + reply_to: (submitter.submission.created_by_user || submitter.template.author)&.friendly_name) end - def completed_email(submitter, user) + def completed_email(submitter, user, bcc: nil) @current_account = submitter.submission.template.account @submitter = submitter + @submission = submitter.submission @user = user + Submissions::EnsureResultGenerated.call(submitter) + @email_config = @current_account.account_configs.find_by(key: AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY) + documents = Submitters.select_attachments_for_download(submitter) + + documents.each do |attachment| + attachments[attachment.filename.to_s] = attachment.download + end + subject = if @email_config ReplaceEmailVariables.call(@email_config.value['subject'], submitter:) @@ -38,12 +47,12 @@ class SubmitterMailer < ApplicationMailer end mail(from: from_address_for_submitter(submitter), - to: user.email, - bcc: @current_account.account_configs.find_by(key: 'bcc_emails')&.value, + to: user.friendly_name, + bcc:, subject:) end - def documents_copy_email(submitter) + def documents_copy_email(submitter, to: nil) @current_account = submitter.submission.template.account @submitter = submitter @@ -65,7 +74,7 @@ class SubmitterMailer < ApplicationMailer end mail(from: from_address_for_submitter(submitter), - to: submitter.email, + to: to || @submitter.friendly_name, subject:) end diff --git a/app/models/account_config.rb b/app/models/account_config.rb index af6137ce..3d0a469c 100644 --- a/app/models/account_config.rb +++ b/app/models/account_config.rb @@ -38,10 +38,8 @@ class AccountConfig < ApplicationRecord SUBMITTER_COMPLETED_EMAIL_KEY => { 'subject' => '{{submitter.name}} has completed the "{{template.name}}" form', 'body' => "Hi,\n\n" \ - "{{submitter.name}} has completed the \"{{template.name}}\" form:\n\n" \ - "{{submission.link}}\n\n" \ - "Thanks,\n" \ - '{{account.name}}' + "\"{{template.name}}\" form has been completed by {{submission.submitters}}\n\n" \ + '{{submission.link}}' }, SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY => { 'subject' => 'Your copy of documents', diff --git a/app/models/submitter.rb b/app/models/submitter.rb index 6849c022..e5a43573 100644 --- a/app/models/submitter.rb +++ b/app/models/submitter.rb @@ -57,6 +57,14 @@ class Submitter < ApplicationRecord end end + def friendly_name + if name.present? + "#{name} <#{email}>" + else + email + end + end + def status_event_at completed_at || opened_at || sent_at || created_at end diff --git a/app/views/submitter_mailer/completed_email.html.erb b/app/views/submitter_mailer/completed_email.html.erb index b1494fb5..df1be4b4 100644 --- a/app/views/submitter_mailer/completed_email.html.erb +++ b/app/views/submitter_mailer/completed_email.html.erb @@ -2,6 +2,6 @@ <%= auto_link(simple_format(h(ReplaceEmailVariables.call(@email_config.value['body'], submitter: @submitter)))) %> <% else %>

Hi there,

-

<%= @submitter.email %> has completed the "<%= @submitter.submission.template.name %>" form.

+

"<%= @submitter.submission.template.name %>" form has been completed by <%= @submitter.submission.submitters.order(:completed_at).map { |e| e.name || e.email || e.phone }.join(', ') %>.

<%= link_to 'View Submission', submission_url(@submitter.submission) %>

<% end %> diff --git a/lib/replace_email_variables.rb b/lib/replace_email_variables.rb index f7d16458..678a03dd 100644 --- a/lib/replace_email_variables.rb +++ b/lib/replace_email_variables.rb @@ -7,28 +7,24 @@ module ReplaceEmailVariables SUBMITTER_EMAIL = '{{submitter.email}}' SUBMITTER_NAME = '{{submitter.name}}' SUBMISSION_LINK = '{{submission.link}}' + SUBMISSION_SUBMITTERS = '{{submission.submitters}}' DOCUMENTS_LINKS = '{{documents.links}}' module_function def call(text, submitter:) - submitter_link = - Rails.application.routes.url_helpers.submit_form_url( - slug: submitter.slug, **Docuseal.default_url_options - ) - - if submitter.submission - submission_link = - Rails.application.routes.url_helpers.submission_url( - submitter.submission, **Docuseal.default_url_options - ) - end + submitter_link = build_submitter_link(submitter) + + submission_link = build_submission_link(submitter.submission) if submitter.submission text = text.gsub(TEMAPLTE_NAME, submitter.template.name) if submitter.template text = text.gsub(SUBMITTER_EMAIL, submitter.email) if submitter.email text = text.gsub(SUBMITTER_NAME, submitter.name || submitter.email || submitter.phone) text = text.gsub(SUBMITTER_LINK, submitter_link) text = text.gsub(SUBMISSION_LINK, submission_link) if submission_link + if text.include?(SUBMISSION_SUBMITTERS) + text = text.gsub(SUBMISSION_SUBMITTERS, build_submission_submitters(submission)) + end text = text.gsub(DOCUMENTS_LINKS, build_documents_links_text(submitter)) text = text.gsub(ACCOUNT_NAME, submitter.template.account.name) if submitter.template @@ -46,4 +42,18 @@ module ReplaceEmailVariables "#{link}\n" end.join end + + def build_submitter_link(submitter) + Rails.application.routes.url_helpers.submit_form_url( + slug: submitter.slug, **Docuseal.default_url_options + ) + end + + def build_submission_link(submission) + Rails.application.routes.url_helpers.submission_url(submission, **Docuseal.default_url_options) + end + + def build_submission_submitters(submission) + submission.submitters.order(:completed_at).map { |e| e.name || e.email || e.phone }.join(', ') + end end diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb index b5fc2d62..8385d81c 100644 --- a/lib/submitters/submit_values.rb +++ b/lib/submitters/submit_values.rb @@ -13,19 +13,9 @@ module Submitters submitter.submission.save! - return unless submitter.completed_at? + return submitter unless submitter.completed_at? - GenerateSubmitterResultAttachmentsJob.perform_later(submitter) - - if submitter.account.encrypted_configs.exists?(key: EncryptedConfig::WEBHOOK_URL_KEY) - SendWebhookRequestJob.perform_later(submitter) - end - - user = submitter.submission.created_by_user || submitter.template.author - - if submitter.template.account.users.exists?(id: user.id) - SubmitterMailer.completed_email(submitter, user).deliver_later! - end + ProcessSubmitterCompletionJob.perform_later(submitter) submitter end