<% @template.submitters.each_with_index do |submitter, index| %>
- <%= f.fields_for :submitters, item = Struct.new(:name, :uuid, :is_requester, :email, :linked_to_uuid, :option).new(*submitter.values_at('name', 'uuid', 'is_requester', 'email', 'linked_to_uuid')), index: do |ff| %>
- <% item.option = item.is_requester.present? ? 'is_requester' : (item.email.present? ? 'email' : (item.linked_to_uuid.present? ? "linked_to_#{item.linked_to_uuid}" : '')) %>
+ <%= f.fields_for :submitters, item = Struct.new(:name, :uuid, :is_requester, :email, :invite_by_uuid, :linked_to_uuid, :option).new(*submitter.values_at('name', 'uuid', 'is_requester', 'email', 'invite_by_uuid', 'linked_to_uuid')), index: do |ff| %>
+ <% item.option = item.is_requester.present? ? 'is_requester' : (item.email.present? ? 'email' : (item.linked_to_uuid.present? ? "linked_to_#{item.linked_to_uuid}" : (item.invite_by_uuid.present? ? "invite_by_#{item.invite_by_uuid}" : ''))) %>
<%= ff.hidden_field :uuid %>
<%= ff.text_field :name, class: 'w-full outline-none border-transparent focus:border-transparent focus:ring-0 bg-base-100 px-1 peer mb-2', autocomplete: 'off', placeholder: "#{index + 1}#{(index + 1).ordinal} Party", required: true %>
<% if @template.submitters.size == 2 %>
- <%= ff.email_field :email, class: 'base-input', autocomplete: 'off', placeholder: 'Default Email', disabled: ff.object.is_requester, id: field_uuid = SecureRandom.uuid %>
+ <%= ff.email_field :email, class: 'base-input', autocomplete: 'off', placeholder: 'Default Email', disabled: ff.object.is_requester || ff.object.invite_by_uuid.present?, id: field_uuid = SecureRandom.uuid %>
<% else %>
- <%= ff.select :option, [['Not specified', 'not_set'], ['Submission requester', 'is_requester'], ['Specified email', 'email'], *(@template.submitters - [submitter]).map { |e| ["Same as #{e['name']}", "linked_to_#{e['uuid']}"] }], {}, class: 'base-select mb-3' %>
+ <%= ff.select :option, [['Not specified', 'not_set'], ['Submission requester', 'is_requester'], ['Specified email', 'email'], *(@template.submitters - [submitter]).map { |e| ["Invite by #{e['name']}", "invite_by_#{e['uuid']}"] }, *(@template.submitters - [submitter]).map { |e| ["Same as #{e['name']}", "linked_to_#{e['uuid']}"] }], {}, class: 'base-select mb-3' %>
<%= ff.email_field :email, class: "base-input #{'hidden' if item.option != 'email'}", autocomplete: 'off', placeholder: 'Default Email', id: email_field_uuid %>
<% end %>
<% if @template.submitters.size == 2 %>
-
+
-
+ <% if index == 1 %>
+
+ <% end %>
+
<% end %>
<% end %>
diff --git a/config/routes.rb b/config/routes.rb
index f5a0a1a5..de403274 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -128,6 +128,7 @@ Rails.application.routes.draw do
resources :values, only: %i[index], controller: 'submit_form_values'
resources :download, only: %i[index], controller: 'submit_form_download'
resources :decline, only: %i[create], controller: 'submit_form_decline'
+ resources :invite, only: %i[create], controller: 'submit_form_invite'
get :completed
end
diff --git a/lib/submission_events.rb b/lib/submission_events.rb
index 1be9f953..e4f93e9e 100644
--- a/lib/submission_events.rb
+++ b/lib/submission_events.rb
@@ -14,6 +14,7 @@ module SubmissionEvents
phone_verified: 'Phone verified',
start_form: 'Submission started',
view_form: 'Form viewed',
+ invite_party: 'Invited',
complete_form: 'Submission completed',
api_complete_form: 'Submission completed via API'
}.freeze
diff --git a/lib/submissions/assign_defined_submitters.rb b/lib/submissions/assign_defined_submitters.rb
index 3862332c..edbd26e5 100644
--- a/lib/submissions/assign_defined_submitters.rb
+++ b/lib/submissions/assign_defined_submitters.rb
@@ -10,14 +10,6 @@ module Submissions
assign_defined_submitters(submission)
assign_linked_submitters(submission)
- if submission.submitters.size == 1 && submission.template.submitters.size == 2 && submission.source != 'embed'
- submission.submitters.new(
- account_id: submission.account_id,
- uuid: submission.template.submitters.find { |e| e['uuid'] != submission.submitters.first.uuid }['uuid'],
- email: submission.template.author.email
- )
- end
-
submission
end
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb
index bb4d4f34..5e0ab509 100644
--- a/lib/submissions/create_from_submitters.rb
+++ b/lib/submissions/create_from_submitters.rb
@@ -39,10 +39,21 @@ module Submissions
next if submission.submitters.blank?
+ maybe_add_invite_submitters(submission, template)
+
submission.tap(&:save!)
end
end
+ def maybe_add_invite_submitters(submission, template)
+ template.submitters.each do |item|
+ next if item['invite_by_uuid'].blank? ||
+ submission.template_submitters.any? { |e| e['uuid'] == item['uuid'] }
+
+ submission.template_submitters << item
+ end
+ end
+
def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil)
template_fields = (submission.template_fields || submission.template.fields).deep_dup
diff --git a/lib/submissions/generate_audit_trail.rb b/lib/submissions/generate_audit_trail.rb
index 70aba66a..cd19e01d 100644
--- a/lib/submissions/generate_audit_trail.rb
+++ b/lib/submissions/generate_audit_trail.rb
@@ -348,13 +348,21 @@ module Submissions
events_data = submission.submission_events.sort_by(&:event_timestamp).map do |event|
submitter = submission.submitters.find { |e| e.id == event.submitter_id }
+
+ text = SubmissionEvents::EVENT_NAMES[event.event_type.to_sym]
+
+ if event.event_type == 'invite_party' &&
+ (invited_submitter = submission.submitters.find { |e| e.uuid == event.data['uuid'] }) &&
+ (name = submission.template_submitters.find { |e| e['uuid'] == event.data['uuid'] }&.dig('name'))
+ text += ['', invited_submitter.name || invited_submitter.email || invited_submitter.phone, name].join(' ')
+ end
+
[
"#{I18n.l(event.event_timestamp.in_time_zone(account.timezone), format: :long, locale: account.locale)} " \
"#{TimeUtils.timezone_abbr(account.timezone, event.event_timestamp)}",
composer.document.layout.formatted_text_box(
[
- { text: SubmissionEvents::EVENT_NAMES[event.event_type.to_sym],
- font: [FONT_NAME, { variant: :bold }] },
+ { text:, font: [FONT_NAME, { variant: :bold }] },
event.event_type.include?('send_') ? ' to ' : ' by ',
if event.event_type.include?('sms') || event.event_type.include?('phone')
event.data['phone'] || submitter.phone
diff --git a/lib/templates.rb b/lib/templates.rb
index a93fd300..54ecd842 100644
--- a/lib/templates.rb
+++ b/lib/templates.rb
@@ -23,4 +23,11 @@ module Templates
templates.where(Template.arel_table[:name].lower.matches("%#{keyword.downcase}%"))
end
+
+ def filter_undefined_submitters(template)
+ template.submitters.to_a.select do |item|
+ item['invite_by_uuid'].blank? && item['linked_to_uuid'].blank? &&
+ item['is_requester'].blank? && item['email'].blank?
+ end
+ end
end