automatically send emails when all parties completed the form

pull/105/head
Alex Turchyn 2 years ago
parent 2fab6984ea
commit 80ad166fd9

@ -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

Loading…
Cancel
Save