add submitters order param

pull/493/merge
Pete Matsyburka 3 months ago
parent 8d3295e125
commit 676b330aa3

@ -185,7 +185,7 @@ module Api
message: %i[subject body], message: %i[subject body],
submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role, submitters: [[:send_email, :send_sms, :completed_redirect_url, :uuid, :name, :email, :role,
:completed, :phone, :application_key, :external_id, :reply_to, :go_to_last, :completed, :phone, :application_key, :external_id, :reply_to, :go_to_last,
:require_phone_2fa, :require_phone_2fa, :order,
{ metadata: {}, values: {}, roles: [], readonly_fields: [], message: %i[subject body], { metadata: {}, values: {}, roles: [], readonly_fields: [], message: %i[subject body],
fields: [:name, :uuid, :default_value, :value, :title, :description, fields: [:name, :uuid, :default_value, :value, :title, :description,
:readonly, :required, :validation_pattern, :invalid_message, :readonly, :required, :validation_pattern, :invalid_message,

@ -135,19 +135,32 @@ class ProcessSubmitterCompletionJob
end end
def enqueue_next_submitter_request_notification(submitter) def enqueue_next_submitter_request_notification(submitter)
next_submitter_item = submission = submitter.submission
submitter.submission.template_submitters.find do |e| submitters_index = submission.submitters.index_by(&:uuid)
sub = submitter.submission.submitters.find { |s| s.uuid == e['uuid'] }
next unless sub next_submitter_items =
if submission.template_submitters.any? { |s| s['order'] }
submitter_groups =
submission.template_submitters.group_by.with_index { |s, index| s['order'] || index }
sub.completed_at.blank? && sub.sent_at.blank? current_group_index = submitter_groups.find { |_, group| group.any? { |s| s['uuid'] == submitter.uuid } }&.first
end
if submitter_groups[current_group_index + 1] &&
submitters_index.values_at(*submitter_groups[current_group_index].pluck('uuid')).all?(&:completed_at?)
submitter_groups[current_group_index + 1]
end
else
submission.template_submitters.find do |e|
sub = submitters_index[e['uuid']]
return unless next_submitter_item next unless sub
sub.completed_at.blank? && sub.sent_at.blank?
end
end
next_submitter = submitter.submission.submitters.find { |s| s.uuid == next_submitter_item['uuid'] } next_submitters = submitters_index.values_at(*Array.wrap(next_submitter_items).pluck('uuid'))
Submitters.send_signature_requests([next_submitter]) Submitters.send_signature_requests(next_submitters)
end end
end end

@ -76,6 +76,7 @@ module Params
type(submitter_params, :name, String) type(submitter_params, :name, String)
type(submitter_params, :reply_to, String) type(submitter_params, :reply_to, String)
type(submitter_params, :email, String) type(submitter_params, :email, String)
type(submitter_params, :order, Integer)
email_format(submitter_params, :email, message: 'email is invalid') email_format(submitter_params, :email, message: 'email is invalid')
email_format(submitter_params, :reply_to, message: 'reply_to email is invalid') email_format(submitter_params, :reply_to, message: 'reply_to email is invalid')
type(submitter_params, :phone, String) type(submitter_params, :phone, String)

@ -142,15 +142,23 @@ module Submissions
submissions.each_with_index do |submission, index| submissions.each_with_index do |submission, index|
delay_seconds = (delay + index).seconds if delay delay_seconds = (delay + index).seconds if delay
submitters = submission.submitters.reject(&:completed_at?) template_submitters = submission.template_submitters
submitters_index = submission.submitters.reject(&:completed_at?).index_by(&:uuid)
if submission.submitters_order_preserved? if template_submitters.any? { |s| s['order'] }
first_submitter = min_order = template_submitters.map.with_index { |s, i| s['order'] || i }.min
submission.template_submitters.filter_map { |s| submitters.find { |e| e.uuid == s['uuid'] } }.first
first_submitters = template_submitters.filter_map do |s|
submitters_index[s['uuid']] if s['order'] == min_order
end
Submitters.send_signature_requests(first_submitters, delay_seconds:)
elsif submission.submitters_order_preserved?
first_submitter = template_submitters.filter_map { |s| submitters_index[s['uuid']] }.first
Submitters.send_signature_requests([first_submitter], delay_seconds:) if first_submitter Submitters.send_signature_requests([first_submitter], delay_seconds:) if first_submitter
else else
Submitters.send_signature_requests(submitters, delay_seconds:) Submitters.send_signature_requests(submitters_index.values, delay_seconds:)
end end
end end
end end

@ -52,9 +52,12 @@ module Submissions
template_submitter = template_submitters.find { |e| e['uuid'] == uuid } template_submitter = template_submitters.find { |e| e['uuid'] == uuid }
end end
submission.template_submitters << template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid') template_submitter = template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid')
template_submitter['order'] = submitter_attrs['order'] if submitter_attrs['order'].present?
is_order_sent = submitters_order == 'random' || index.zero? submission.template_submitters << template_submitter
is_order_sent = submitters_order == 'random' || (template_submitter['order'] || index).zero?
build_submitter(submission:, attrs: submitter_attrs, build_submitter(submission:, attrs: submitter_attrs,
uuid:, is_order_sent:, user:, params:, uuid:, is_order_sent:, user:, params:,

@ -162,13 +162,22 @@ module Submitters
end end
def current_submitter_order?(submitter) def current_submitter_order?(submitter)
submitter_items = submitter.submission.template_submitters || submitter.submission.template.submitters submission = submitter.submission
before_items = submitter_items[0...(submitter_items.find_index { |e| e['uuid'] == submitter.uuid })] submitter_items = submission.template_submitters || submission.template.submitters
before_items.reduce(true) do |acc, item| before_items =
acc && submitter.submission.submitters.find { |e| e.uuid == item['uuid'] }&.completed_at? if submitter_items.any? { |s| s['order'] }
end submitter_groups = submitter_items.group_by.with_index { |s, index| s['order'] || index }.sort_by(&:first)
current_group_index = submitter_groups.find_index { |_, group| group.any? { |s| s['uuid'] == submitter.uuid } }
submitter_groups.first(current_group_index).flat_map(&:last)
else
submitter_items.first(submitter_items.find_index { |e| e['uuid'] == submitter.uuid })
end
before_items.all? { |item| submission.submitters.find { |e| e.uuid == item['uuid'] }&.completed_at? }
end end
def build_document_filename(submitter, blob, filename_format) def build_document_filename(submitter, blob, filename_format)

Loading…
Cancel
Save