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)
|
Submissions::EnsureResultGenerated.call(submitter)
|
||||||
|
|
||||||
|
last_submitter = submitter.submission.submitters.order(:completed_at).last
|
||||||
|
|
||||||
|
Submissions::EnsureResultGenerated.call(last_submitter)
|
||||||
|
|
||||||
urls =
|
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)
|
helpers.rails_blob_url(attachment)
|
||||||
end
|
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'
|
'You have been invited to submit a form'
|
||||||
end
|
end
|
||||||
|
|
||||||
mail(to: @submitter.email,
|
mail(to: @submitter.friendly_name,
|
||||||
from: from_address_for_submitter(submitter),
|
from: from_address_for_submitter(submitter),
|
||||||
subject:,
|
subject:,
|
||||||
reply_to: submitter.submission.created_by_user&.friendly_name)
|
reply_to: (submitter.submission.created_by_user || submitter.template.author)&.friendly_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
def completed_email(submitter, user)
|
def completed_email(submitter, user, bcc: nil)
|
||||||
@current_account = submitter.submission.template.account
|
@current_account = submitter.submission.template.account
|
||||||
@submitter = submitter
|
@submitter = submitter
|
||||||
|
@submission = submitter.submission
|
||||||
@user = user
|
@user = user
|
||||||
|
|
||||||
|
Submissions::EnsureResultGenerated.call(submitter)
|
||||||
|
|
||||||
@email_config = @current_account.account_configs.find_by(key: AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY)
|
@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 =
|
subject =
|
||||||
if @email_config
|
if @email_config
|
||||||
ReplaceEmailVariables.call(@email_config.value['subject'], submitter:)
|
ReplaceEmailVariables.call(@email_config.value['subject'], submitter:)
|
||||||
@@ -38,12 +47,12 @@ class SubmitterMailer < ApplicationMailer
|
|||||||
end
|
end
|
||||||
|
|
||||||
mail(from: from_address_for_submitter(submitter),
|
mail(from: from_address_for_submitter(submitter),
|
||||||
to: user.email,
|
to: user.friendly_name,
|
||||||
bcc: @current_account.account_configs.find_by(key: 'bcc_emails')&.value,
|
bcc:,
|
||||||
subject:)
|
subject:)
|
||||||
end
|
end
|
||||||
|
|
||||||
def documents_copy_email(submitter)
|
def documents_copy_email(submitter, to: nil)
|
||||||
@current_account = submitter.submission.template.account
|
@current_account = submitter.submission.template.account
|
||||||
@submitter = submitter
|
@submitter = submitter
|
||||||
|
|
||||||
@@ -65,7 +74,7 @@ class SubmitterMailer < ApplicationMailer
|
|||||||
end
|
end
|
||||||
|
|
||||||
mail(from: from_address_for_submitter(submitter),
|
mail(from: from_address_for_submitter(submitter),
|
||||||
to: submitter.email,
|
to: to || @submitter.friendly_name,
|
||||||
subject:)
|
subject:)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -38,10 +38,8 @@ class AccountConfig < ApplicationRecord
|
|||||||
SUBMITTER_COMPLETED_EMAIL_KEY => {
|
SUBMITTER_COMPLETED_EMAIL_KEY => {
|
||||||
'subject' => '{{submitter.name}} has completed the "{{template.name}}" form',
|
'subject' => '{{submitter.name}} has completed the "{{template.name}}" form',
|
||||||
'body' => "Hi,\n\n" \
|
'body' => "Hi,\n\n" \
|
||||||
"{{submitter.name}} has completed the \"{{template.name}}\" form:\n\n" \
|
"\"{{template.name}}\" form has been completed by {{submission.submitters}}\n\n" \
|
||||||
"{{submission.link}}\n\n" \
|
'{{submission.link}}'
|
||||||
"Thanks,\n" \
|
|
||||||
'{{account.name}}'
|
|
||||||
},
|
},
|
||||||
SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY => {
|
SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY => {
|
||||||
'subject' => 'Your copy of documents',
|
'subject' => 'Your copy of documents',
|
||||||
|
|||||||
@@ -57,6 +57,14 @@ class Submitter < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def friendly_name
|
||||||
|
if name.present?
|
||||||
|
"#{name} <#{email}>"
|
||||||
|
else
|
||||||
|
email
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def status_event_at
|
def status_event_at
|
||||||
completed_at || opened_at || sent_at || created_at
|
completed_at || opened_at || sent_at || created_at
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
<%= auto_link(simple_format(h(ReplaceEmailVariables.call(@email_config.value['body'], submitter: @submitter)))) %>
|
<%= auto_link(simple_format(h(ReplaceEmailVariables.call(@email_config.value['body'], submitter: @submitter)))) %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<p>Hi there,</p>
|
<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>
|
<p><%= link_to 'View Submission', submission_url(@submitter.submission) %></p>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|||||||
@@ -7,28 +7,24 @@ module ReplaceEmailVariables
|
|||||||
SUBMITTER_EMAIL = '{{submitter.email}}'
|
SUBMITTER_EMAIL = '{{submitter.email}}'
|
||||||
SUBMITTER_NAME = '{{submitter.name}}'
|
SUBMITTER_NAME = '{{submitter.name}}'
|
||||||
SUBMISSION_LINK = '{{submission.link}}'
|
SUBMISSION_LINK = '{{submission.link}}'
|
||||||
|
SUBMISSION_SUBMITTERS = '{{submission.submitters}}'
|
||||||
DOCUMENTS_LINKS = '{{documents.links}}'
|
DOCUMENTS_LINKS = '{{documents.links}}'
|
||||||
|
|
||||||
module_function
|
module_function
|
||||||
|
|
||||||
def call(text, submitter:)
|
def call(text, submitter:)
|
||||||
submitter_link =
|
submitter_link = build_submitter_link(submitter)
|
||||||
Rails.application.routes.url_helpers.submit_form_url(
|
|
||||||
slug: submitter.slug, **Docuseal.default_url_options
|
|
||||||
)
|
|
||||||
|
|
||||||
if submitter.submission
|
submission_link = build_submission_link(submitter.submission) if submitter.submission
|
||||||
submission_link =
|
|
||||||
Rails.application.routes.url_helpers.submission_url(
|
|
||||||
submitter.submission, **Docuseal.default_url_options
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
text = text.gsub(TEMAPLTE_NAME, submitter.template.name) if submitter.template
|
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_EMAIL, submitter.email) if submitter.email
|
||||||
text = text.gsub(SUBMITTER_NAME, submitter.name || submitter.email || submitter.phone)
|
text = text.gsub(SUBMITTER_NAME, submitter.name || submitter.email || submitter.phone)
|
||||||
text = text.gsub(SUBMITTER_LINK, submitter_link)
|
text = text.gsub(SUBMITTER_LINK, submitter_link)
|
||||||
text = text.gsub(SUBMISSION_LINK, submission_link) if submission_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(DOCUMENTS_LINKS, build_documents_links_text(submitter))
|
||||||
|
|
||||||
text = text.gsub(ACCOUNT_NAME, submitter.template.account.name) if submitter.template
|
text = text.gsub(ACCOUNT_NAME, submitter.template.account.name) if submitter.template
|
||||||
@@ -46,4 +42,18 @@ module ReplaceEmailVariables
|
|||||||
"#{link}\n"
|
"#{link}\n"
|
||||||
end.join
|
end.join
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
@@ -13,19 +13,9 @@ module Submitters
|
|||||||
|
|
||||||
submitter.submission.save!
|
submitter.submission.save!
|
||||||
|
|
||||||
return unless submitter.completed_at?
|
return submitter unless submitter.completed_at?
|
||||||
|
|
||||||
GenerateSubmitterResultAttachmentsJob.perform_later(submitter)
|
ProcessSubmitterCompletionJob.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
|
|
||||||
|
|
||||||
submitter
|
submitter
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user