Files
docuseal/app/mailers/submitter_mailer.rb
T

207 lines
7.2 KiB
Ruby
Raw Normal View History

2023-06-13 00:29:07 +03:00
# frozen_string_literal: true
class SubmitterMailer < ApplicationMailer
2023-10-22 01:54:20 +03:00
MAX_ATTACHMENTS_SIZE = 10.megabytes
2024-02-25 02:00:18 +02:00
SIGN_TTL = 1.hour + 20.minutes
2023-10-22 01:54:20 +03:00
2023-11-23 20:03:52 +02:00
DEFAULT_INVITATION_SUBJECT = 'You are invited to submit a form'
2024-08-01 21:25:09 +03:00
NO_REPLY_REGEXP = /no-?reply@/i
2023-11-23 20:03:52 +02:00
def invitation_email(submitter)
2024-03-31 17:40:51 +03:00
@current_account = submitter.submission.account
2023-06-13 00:29:07 +03:00
@submitter = submitter
2023-11-23 20:03:52 +02:00
if submitter.preferences['email_message_uuid']
@email_message = submitter.account.email_messages.find_by(uuid: submitter.preferences['email_message_uuid'])
end
2024-04-17 16:08:58 +03:00
@body = @email_message&.body.presence || @submitter.template.preferences['request_email_body'].presence
@subject = @email_message&.subject.presence || @submitter.template.preferences['request_email_subject'].presence
2023-06-13 00:29:07 +03:00
2023-11-17 18:47:04 +02:00
@email_config = AccountConfigs.find_for_account(@current_account, AccountConfig::SUBMITTER_INVITATION_EMAIL_KEY)
2023-08-16 22:57:59 +03:00
subject =
2023-11-23 20:03:52 +02:00
if @email_config || @subject
ReplaceEmailVariables.call(@subject || @email_config.value['subject'], submitter:)
2023-08-16 22:57:59 +03:00
else
2023-11-23 20:03:52 +02:00
DEFAULT_INVITATION_SUBJECT
2023-08-16 22:57:59 +03:00
end
2024-06-04 11:48:02 +03:00
assign_message_metadata('submitter_invitation', @submitter)
2024-08-01 21:25:09 +03:00
reply_to = build_submitter_reply_to(@submitter)
2023-12-11 21:40:13 +02:00
mail(
to: @submitter.friendly_name,
from: from_address_for_submitter(submitter),
subject:,
2024-08-01 21:25:09 +03:00
reply_to:
2023-12-11 21:40:13 +02:00
)
2023-06-13 00:29:07 +03:00
end
2024-01-02 11:41:28 +02:00
def completed_email(submitter, user, to: nil)
2024-03-31 17:40:51 +03:00
@current_account = submitter.submission.account
2023-06-13 00:29:07 +03:00
@submitter = submitter
@submission = submitter.submission
2023-06-26 00:46:01 +03:00
@user = user
2023-06-13 00:29:07 +03:00
Submissions::EnsureResultGenerated.call(submitter)
2023-11-17 18:47:04 +02:00
@email_config = AccountConfigs.find_for_account(@current_account, AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY)
2023-08-20 00:10:54 +03:00
2024-01-14 01:59:13 +02:00
add_completed_email_attachments!(
submitter,
with_documents: @email_config&.value&.dig('attach_documents') != false &&
@submitter.template.preferences['completed_notification_email_attach_documents'] != false,
with_audit_log: @email_config&.value&.dig('attach_audit_log') != false &&
@submitter.template.preferences['completed_notification_email_attach_audit'] != false
2024-01-14 01:59:13 +02:00
)
2024-06-21 14:05:23 +03:00
@subject = @submitter.template.preferences['completed_notification_email_subject'].presence
@subject ||= @email_config.value['subject'] if @email_config
@body = @submitter.template.preferences['completed_notification_email_body'].presence
@body ||= @email_config.value['body'] if @email_config
2023-08-20 00:10:54 +03:00
subject =
2024-06-21 14:05:23 +03:00
if @subject.present?
ReplaceEmailVariables.call(@subject, submitter:)
2023-08-20 00:10:54 +03:00
else
2024-06-21 14:05:23 +03:00
build_completed_subject(submitter)
2023-08-20 00:10:54 +03:00
end
2024-06-04 11:48:02 +03:00
assign_message_metadata('submitter_completed', @submitter)
2023-08-20 00:10:54 +03:00
mail(from: from_address_for_submitter(submitter),
2024-01-02 11:41:28 +02:00
to: to || (user.role == 'integration' ? user.friendly_name.sub(/\+\w+@/, '@') : user.friendly_name),
2023-08-20 00:10:54 +03:00
subject:)
2023-06-26 00:46:01 +03:00
end
2024-08-21 09:22:59 +03:00
def declined_email(submitter, user)
@current_account = submitter.submission.account
@submitter = submitter
@submission = submitter.submission
@user = user
assign_message_metadata('submitter_declined', @submitter)
I18n.with_locale(submitter.account.locale) do
mail(from: from_address_for_submitter(submitter),
to: user.role == 'integration' ? user.friendly_name.sub(/\+\w+@/, '@') : user.friendly_name,
2024-08-21 14:21:01 +03:00
reply_to: @submitter.friendly_name,
2024-08-21 09:22:59 +03:00
subject: I18n.t(:name_declined_by_submitter,
name: @submission.template.name.truncate(20),
submitter: @submitter.name || @submitter.email || @submitter.phone))
end
end
2024-02-25 02:00:18 +02:00
def documents_copy_email(submitter, to: nil, sig: false)
2024-03-31 17:40:51 +03:00
@current_account = submitter.submission.account
2023-06-26 00:46:01 +03:00
@submitter = submitter
2024-02-25 02:00:18 +02:00
@sig = submitter.signed_id(expires_in: SIGN_TTL, purpose: :download_completed) if sig
2023-07-01 13:16:07 +03:00
Submissions::EnsureResultGenerated.call(@submitter)
2023-11-17 18:47:04 +02:00
@email_config = AccountConfigs.find_for_account(@current_account, AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY)
2023-08-20 00:10:54 +03:00
2024-01-14 12:38:08 +02:00
@documents = add_completed_email_attachments!(
2024-06-21 14:05:23 +03:00
submitter, with_audit_log: @submitter.template.preferences['documents_copy_email_attach_audit'] != false &&
(@email_config.nil? || @email_config.value['attach_audit_log'] != false)
2024-01-14 12:38:08 +02:00
)
@subject = @submitter.template.preferences['documents_copy_email_subject'].presence
@subject ||= @email_config.value['subject'] if @email_config
@body = @submitter.template.preferences['documents_copy_email_body'].presence
@body ||= @email_config.value['body'] if @email_config
2023-08-20 00:10:54 +03:00
subject =
if @subject.present?
ReplaceEmailVariables.call(@subject, submitter:)
2023-08-20 00:10:54 +03:00
else
2023-10-12 22:42:14 +03:00
'Your document copy'
2023-08-20 00:10:54 +03:00
end
2024-06-04 11:48:02 +03:00
assign_message_metadata('submitter_documents_copy', @submitter)
2024-08-01 21:25:09 +03:00
reply_to = build_submitter_reply_to(submitter)
2023-08-20 00:10:54 +03:00
mail(from: from_address_for_submitter(submitter),
to: to || @submitter.friendly_name,
2024-08-01 21:25:09 +03:00
reply_to:,
2023-08-20 00:10:54 +03:00
subject:)
end
private
2024-08-01 21:25:09 +03:00
def build_submitter_reply_to(submitter)
reply_to =
submitter.preferences['reply_to'].presence ||
(submitter.submission.created_by_user || submitter.template.author)&.friendly_name&.sub(/\+\w+@/, '@')
return nil if reply_to.to_s.match?(NO_REPLY_REGEXP)
reply_to
end
2024-06-21 14:05:23 +03:00
def build_completed_subject(submitter)
submitters = submitter.submission.submitters.order(:completed_at)
.map { |e| e.name || e.email || e.phone }.join(', ')
%(#{submitter.submission.template.name} has been completed by #{submitters})
end
def add_completed_email_attachments!(submitter, with_audit_log: true, with_documents: true)
documents = with_documents ? Submitters.select_attachments_for_download(submitter) : []
2023-09-10 19:25:57 +03:00
2023-10-22 01:54:20 +03:00
total_size = 0
audit_trail_data = nil
2023-09-10 19:25:57 +03:00
2024-01-14 01:59:13 +02:00
if with_audit_log && submitter.submission.audit_trail.present?
2023-10-22 01:54:20 +03:00
audit_trail_data = submitter.submission.audit_trail.download
total_size = audit_trail_data.size
end
2023-12-02 23:03:24 +02:00
total_size = add_attachments_with_size_limit(documents, total_size)
2024-06-18 20:09:58 +03:00
attachments[submitter.submission.audit_trail.filename.to_s.tr('"', "'")] = audit_trail_data if audit_trail_data
2023-12-02 23:03:24 +02:00
if with_documents
file_fields = submitter.submission.template_fields.select { |e| e['type'].in?(%w[file payment]) }
2023-12-02 23:03:24 +02:00
if file_fields.pluck('submitter_uuid').uniq.size == 1
storage_attachments =
submitter.attachments.where(uuid: submitter.values.values_at(*file_fields.pluck('uuid')).flatten)
2023-12-02 23:03:24 +02:00
add_attachments_with_size_limit(storage_attachments, total_size)
end
2023-12-02 23:03:24 +02:00
end
documents
end
def add_attachments_with_size_limit(storage_attachments, current_size)
total_size = current_size
storage_attachments.each do |attachment|
2023-10-23 22:45:34 +03:00
total_size += attachment.byte_size
2023-10-22 01:54:20 +03:00
break if total_size >= MAX_ATTACHMENTS_SIZE
2024-06-18 20:09:58 +03:00
attachments[attachment.filename.to_s.tr('"', "'")] = attachment.download
2023-09-10 19:25:57 +03:00
end
2023-12-02 23:03:24 +02:00
total_size
2023-09-10 19:25:57 +03:00
end
2023-08-20 00:10:54 +03:00
def from_address_for_submitter(submitter)
2023-12-15 10:24:33 +02:00
if submitter.submission.source.in?(%w[api embed]) &&
2023-12-11 21:40:13 +02:00
(from_email = AccountConfig.find_by(account: submitter.account, key: 'integration_from_email')&.value.presence)
from_email
else
(submitter.submission.created_by_user || submitter.submission.template.author).friendly_name
end
2023-06-13 00:29:07 +03:00
end
end