invite party via field

This commit is contained in:
Pete Matsyburka
2026-02-20 12:27:39 +02:00
parent 65c275ac17
commit ba84741a64
15 changed files with 114 additions and 31 deletions
+7 -2
View File
@@ -56,7 +56,9 @@ module Submissions
template_submitter = template_submitters.find { |e| e['uuid'] == uuid }
end
template_submitter = template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid')
template_submitter = template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid',
'invite_via_field_uuid')
template_submitter['order'] = submitter_attrs['order'] if submitter_attrs['order'].present?
submission.template_submitters << template_submitter
@@ -113,7 +115,10 @@ module Submissions
item = item.merge('invite_by_uuid' => invite_by_uuid) if invite_by_uuid
end
next if item['invite_by_uuid'].blank? && item['optional_invite_by_uuid'].blank?
next if item['invite_by_uuid'].blank? &&
item['optional_invite_by_uuid'].blank? &&
item['invite_via_field_uuid'].blank?
next if submission.template_submitters.any? { |e| e['uuid'] == item['uuid'] }
item = item.merge('order' => submitter_attr['order']) if submitter_attr && submitter_attr['order'].present?
+47 -1
View File
@@ -6,6 +6,7 @@ module Submitters
RequiredFieldError = Class.new(StandardError)
VARIABLE_REGEXP = /\{\{?(\w+)\}\}?/
PHONE_REGEXP = /[+\d()\s-]+/
NONEDITABLE_FIELD_TYPES = %w[stamp heading strikethrough].freeze
STRFTIME_MAP = {
@@ -52,7 +53,11 @@ module Submitters
ActiveStorage::Attachment.where(uuid: touch_attachment_uuid, record: submitter).touch_all(:created_at)
end
SubmissionEvents.create_with_tracking_data(submitter, 'complete_form', request) if params[:completed] == 'true'
if params[:completed] == 'true'
maybe_invite_via_field(submitter, request)
SubmissionEvents.create_with_tracking_data(submitter, 'complete_form', request)
end
submitter.save!
end
@@ -405,6 +410,47 @@ module Submitters
end
end
def maybe_invite_via_field(submitter, request)
submission = submitter.submission
is_invited = false
submission.template_submitters.each do |s|
field_uuid = s['invite_via_field_uuid']
next if field_uuid.blank?
field = submission.template_fields.find { |e| e['uuid'] == field_uuid }
next unless field
next unless field['submitter_uuid'] == submitter.uuid
next if submission.submitters.exists?(uuid: s['uuid'])
value = submitter.values[field_uuid]
next if value.blank?
if value.include?('@')
email = Submissions.normalize_email(value)
elsif value.match?(PHONE_REGEXP)
phone = value.gsub(/[^+\d]/, '')
end
next if email.blank? && phone.blank?
submission.submitters.create!(uuid: s['uuid'], email:, phone:, account_id: submitter.account_id)
SubmissionEvents.create_with_tracking_data(submitter, 'invite_party', request, { uuid: submitter.uuid })
is_invited = true
end
submission.update!(submitters_order: :preserved) if is_invited
submitter
end
def validate_value!(_value, field, _params, submitter, _request)
if field['readonly'] == true
Rollbar.warning("Readonly field #{submitter.id}: #{field['uuid']}") if defined?(Rollbar)
+1
View File
@@ -72,6 +72,7 @@ module Templates
def filter_undefined_submitters(template_submitters)
template_submitters.to_a.select do |item|
item['invite_by_uuid'].blank? && item['optional_invite_by_uuid'].blank? &&
item['invite_via_field_uuid'].blank? &&
item['linked_to_uuid'].blank? && item['is_requester'].blank? && item['email'].blank?
end
end
+20 -16
View File
@@ -4,7 +4,7 @@ module Templates
module Clone
module_function
# rubocop:disable Metrics, Style/CombinableLoops
# rubocop:disable Metrics
def call(original_template, author:, external_id: nil, name: nil, folder_name: nil)
template = original_template.account.templates.new
@@ -49,20 +49,6 @@ module Templates
submitter['uuid'] = new_submitter_uuid
end
cloned_submitters.each do |submitter|
if submitter['optional_invite_by_uuid'].present?
submitter['optional_invite_by_uuid'] = submitter_uuids_replacements[submitter['optional_invite_by_uuid']]
end
if submitter['invite_by_uuid'].present?
submitter['invite_by_uuid'] = submitter_uuids_replacements[submitter['invite_by_uuid']]
end
if submitter['linked_to_uuid'].present?
submitter['linked_to_uuid'] = submitter_uuids_replacements[submitter['linked_to_uuid']]
end
end
cloned_preferences['submitters'].to_a.each do |submitter|
submitter['uuid'] = submitter_uuids_replacements[submitter['uuid']]
end
@@ -97,8 +83,26 @@ module Templates
end
end
cloned_submitters.each do |submitter|
if submitter['optional_invite_by_uuid'].present?
submitter['optional_invite_by_uuid'] = submitter_uuids_replacements[submitter['optional_invite_by_uuid']]
end
if submitter['invite_by_uuid'].present?
submitter['invite_by_uuid'] = submitter_uuids_replacements[submitter['invite_by_uuid']]
end
if submitter['linked_to_uuid'].present?
submitter['linked_to_uuid'] = submitter_uuids_replacements[submitter['linked_to_uuid']]
end
if submitter['invite_via_field_uuid'].present?
submitter['invite_via_field_uuid'] = field_uuids_replacements[submitter['invite_via_field_uuid']]
end
end
[cloned_submitters, cloned_fields, cloned_schema, cloned_preferences]
end
# rubocop:enable Metrics, Style/CombinableLoops
# rubocop:enable Metrics
end
end