allow to delegate

This commit is contained in:
Pete Matsyburka
2026-03-27 12:56:52 +02:00
parent c23eca0ade
commit 3eb0b8a89f
23 changed files with 454 additions and 85 deletions
+1
View File
@@ -175,6 +175,7 @@ module Accounts
def can_send_emails?(_account, **_params)
return true if Docuseal.multitenant?
return true if Rails.env.development?
return true if ENV['SMTP_ADDRESS'].present?
EncryptedConfig.exists?(key: EncryptedConfig::EMAIL_SMTP_KEY)
+28 -24
View File
@@ -246,33 +246,25 @@ module Submissions
next if submitter.blank?
completed_event =
submission.submission_events.find { |e| e.submitter_id == submitter.id && e.complete_form? } ||
SubmissionEvent.new
submission_events = submission.submission_events.select { |e| e.submitter_id == submitter.id }
click_email_event =
submission.submission_events.find { |e| e.submitter_id == submitter.id && e.click_email? }
delegated_event = submission_events.select(&:delegate_form?).max_by(&:event_timestamp)
verify_email_event =
submission.submission_events.find { |e| e.submitter_id == submitter.id && e.email_verified? }
if delegated_event
submission_events = submission_events.select { |e| e.event_timestamp > delegated_event.event_timestamp }
end
is_phone_verified =
submission.template_fields.any? do |e|
e['type'] == 'phone' && e['submitter_uuid'] == submitter.uuid && submitter.values[e['uuid']].present?
end
completed_event = submission_events.find(&:complete_form?) || SubmissionEvent.new
verify_phone_event =
submission.submission_events.find { |e| e.submitter_id == submitter.id && e.phone_verified? }
click_email_event = submission_events.find(&:click_email?)
is_id_verified =
submission.template_fields.any? do |e|
e['type'] == 'verification' && e['submitter_uuid'] == submitter.uuid && submitter.values[e['uuid']].present?
end
verify_email_event = submission_events.find(&:email_verified?)
is_kba_passed =
submission.template_fields.any? do |e|
e['type'] == 'kba' && e['submitter_uuid'] == submitter.uuid && submitter.values[e['uuid']].present?
end
verify_phone_event = submission_events.find(&:phone_verified?)
is_id_verified = submission_events.any?(&:complete_verification?)
is_kba_passed = submission_events.any?(&:complete_kba?)
info_rows = [
[
@@ -291,7 +283,7 @@ module Submissions
submitter.email && (click_email_event || verify_email_event) && {
text: "#{I18n.t('email_verification')}: #{I18n.t('verified')}\n"
},
submitter.phone && (is_phone_verified || verify_phone_event) && {
submitter.phone && verify_phone_event && {
text: "#{I18n.t('phone_verification')}: #{I18n.t('verified')}\n"
},
is_id_verified && {
@@ -446,15 +438,23 @@ module Submissions
composer.text(I18n.t('event_log'), font_size: 12, padding: [10, 0, 20, 0])
submitter_versions_index = submission.submitters.each_with_object({}) do |s, h|
h[s.id] = s.submitter_versions.to_a.sort_by(&:created_at)
end
events_data = submission.submission_events.sort_by(&:event_timestamp).filter_map do |event|
next if event.event_type.in?(%w[bounce_email complaint_email])
submitter = submission.submitters.find { |e| e.id == event.submitter_id }
versions = submitter_versions_index[submitter.id] || []
active_version = versions.find { |v| v.created_at > event.event_timestamp }
submitter_name =
if event.event_type.include?('sms') || event.event_type.include?('phone')
event.data['phone'] || submitter.phone
event.data['phone'] || active_version&.phone || submitter.phone
else
submitter.name || submitter.email || submitter.phone
active_version&.name || active_version&.email || active_version&.phone ||
submitter.name || submitter.email || submitter.phone
end
text =
@@ -473,6 +473,10 @@ module Submissions
I18n.t("submission_event_names.#{event.event_type}_to_html", submitter_name:),
"<b>#{I18n.t(:from)}</b> #{submission.created_by_user.full_name} #{submission.created_by_user.email}"
].join("\n")
elsif event.event_type == 'delegate_form'
from = event.data['old_email'].presence ||
versions.reverse.find { |v| v.created_at <= event.event_timestamp }&.then { |v| v.name || v.phone }
I18n.t('submission_event_names.delegate_form_by_html', from:, to: event.data['email'])
elsif event.event_type.include?('send_')
I18n.t("submission_event_names.#{event.event_type}_to_html", submitter_name:)
else
+3 -1
View File
@@ -8,6 +8,7 @@ module Submitters
AccountConfig::FORM_PREFILL_SIGNATURE_KEY,
AccountConfig::WITH_SIGNATURE_ID,
AccountConfig::ALLOW_TO_DECLINE_KEY,
AccountConfig::ALLOW_TO_DELEGATE_KEY,
AccountConfig::ENFORCE_SIGNING_ORDER_KEY,
AccountConfig::REQUIRE_SIGNING_REASON_KEY,
AccountConfig::REUSE_SIGNATURE_KEY,
@@ -31,6 +32,7 @@ module Submitters
prefill_signature = find_safe_value(configs, AccountConfig::FORM_PREFILL_SIGNATURE_KEY) != false
reuse_signature = find_safe_value(configs, AccountConfig::REUSE_SIGNATURE_KEY) != false
with_decline = find_safe_value(configs, AccountConfig::ALLOW_TO_DECLINE_KEY) != false
with_delegate = find_safe_value(configs, AccountConfig::ALLOW_TO_DELEGATE_KEY) == true
with_partial_download = find_safe_value(configs, AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY) != false
with_signature_id = find_safe_value(configs, AccountConfig::WITH_SIGNATURE_ID) == true
require_signing_reason = find_safe_value(configs, AccountConfig::REQUIRE_SIGNING_REASON_KEY) == true
@@ -42,7 +44,7 @@ module Submitters
policy_links = find_safe_value(configs, AccountConfig::POLICY_LINKS_KEY)
attrs = { completed_button:, with_typed_signature:, with_confetti:,
reuse_signature:, with_decline:, with_partial_download:,
reuse_signature:, with_decline:, with_delegate:, with_partial_download:,
policy_links:, enforce_signing_order:, completed_message:,
require_signing_reason:, prefill_signature:, with_submitter_timezone:,
with_signature_id_reason:, with_signature_id:, with_field_labels:, with_timestamp_seconds: }