automatically send emails when all parties completed the form
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -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 %>
|
||||
|
||||
@@ -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
|
||||
)
|
||||
submitter_link = build_submitter_link(submitter)
|
||||
|
||||
if submitter.submission
|
||||
submission_link =
|
||||
Rails.application.routes.url_helpers.submission_url(
|
||||
submitter.submission, **Docuseal.default_url_options
|
||||
)
|
||||
end
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user