automatically send emails when all parties completed the form

This commit is contained in:
Alex Turchyn
2023-09-09 00:43:32 +03:00
parent 2fab6984ea
commit 80ad166fd9
9 changed files with 86 additions and 42 deletions
@@ -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
@@ -1,7 +0,0 @@
# frozen_string_literal: true
class GenerateSubmitterResultAttachmentsJob < ApplicationJob
def perform(submitter)
Submissions::EnsureResultGenerated.call(submitter)
end
end
@@ -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
+16 -7
View File
@@ -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
+2 -4
View File
@@ -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',
+8
View File
@@ -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
@@ -2,6 +2,6 @@
<%= auto_link(simple_format(h(ReplaceEmailVariables.call(@email_config.value['body'], submitter: @submitter)))) %>
<% else %>
<p>Hi there,</p>
<p><%= @submitter.email %> has completed the "<%= @submitter.submission.template.name %>" form.</p>
<p>"<%= @submitter.submission.template.name %>" form has been completed by <%= @submitter.submission.submitters.order(:completed_at).map { |e| e.name || e.email || e.phone }.join(', ') %>.</p>
<p><%= link_to 'View Submission', submission_url(@submitter.submission) %></p>
<% end %>