view only party
This commit is contained in:
+23
-4
@@ -6,7 +6,10 @@ module Submissions
|
||||
module_function
|
||||
|
||||
def maybe_update_completed_at(submission)
|
||||
incomplete_submitter = Submitter.where(submission_id: submission.id, completed_at: nil).select(1)
|
||||
viewer_uuids = submission.template_submitters.to_a.filter_map { |s| s['uuid'] if s['is_viewer'] }
|
||||
|
||||
incomplete_submitter = Submitter.where(submission_id: submission.id, completed_at: nil).limit(1)
|
||||
incomplete_submitter = incomplete_submitter.where.not(uuid: viewer_uuids) if viewer_uuids.present?
|
||||
|
||||
max_completed_at =
|
||||
Arel::Nodes::Grouping.new(
|
||||
@@ -16,7 +19,7 @@ module Submissions
|
||||
)
|
||||
|
||||
Submission.where(id: submission.id, completed_at: nil)
|
||||
.where.not(incomplete_submitter.arel.exists)
|
||||
.where.not(incomplete_submitter.select(1).arel.exists)
|
||||
.update_all(completed_at: max_completed_at)
|
||||
.positive?
|
||||
end
|
||||
@@ -124,6 +127,8 @@ module Submissions
|
||||
|
||||
Submissions::CreateFromSubmitters.maybe_set_dynamic_documents(submission)
|
||||
|
||||
Submissions::CreateFromSubmitters.assign_submitters_is_viewer(submission)
|
||||
|
||||
submission.save!
|
||||
|
||||
if submission.expire_at?
|
||||
@@ -163,15 +168,29 @@ module Submissions
|
||||
|
||||
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
|
||||
first_submitter = template_submitters.filter_map { |s| submitters_index[s['uuid']] }.find { |s| !s.viewer? }
|
||||
|
||||
Submitters.send_signature_requests([first_submitter], delay_seconds:) if first_submitter
|
||||
if first_submitter
|
||||
first_viewers = find_first_viewers(first_submitter, submitters_index)
|
||||
|
||||
Submitters.send_signature_requests([first_submitter, *first_viewers], delay_seconds:)
|
||||
end
|
||||
else
|
||||
Submitters.send_signature_requests(submitters_index.values, delay_seconds:)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def find_first_viewers(first_submitter, submitters_index)
|
||||
first_submitter.submission.template_submitters.each_with_object([]) do |s, viewers|
|
||||
submitter = submitters_index[s['uuid']]
|
||||
|
||||
break viewers if submitter && !submitter.viewer? && submitter != first_submitter
|
||||
|
||||
viewers << submitter if submitter&.viewer?
|
||||
end
|
||||
end
|
||||
|
||||
def normalize_email(email)
|
||||
return if email.blank?
|
||||
return if email.is_a?(Numeric)
|
||||
|
||||
@@ -10,6 +10,8 @@ module Submissions
|
||||
assign_defined_submitters(submission)
|
||||
assign_linked_submitters(submission)
|
||||
|
||||
Submissions::CreateFromSubmitters.assign_submitters_is_viewer(submission)
|
||||
|
||||
submission
|
||||
end
|
||||
|
||||
|
||||
@@ -90,6 +90,8 @@ module Submissions
|
||||
|
||||
maybe_add_invite_submitters(submission, template, attrs[:submitters])
|
||||
|
||||
assign_submitters_is_viewer(submission)
|
||||
|
||||
submission.template = nil unless with_template
|
||||
|
||||
submission.tap(&:save!)
|
||||
@@ -100,6 +102,34 @@ module Submissions
|
||||
submissions
|
||||
end
|
||||
|
||||
def assign_submitters_is_viewer(submission)
|
||||
template_fields = submission.template_fields || submission.template.fields
|
||||
field_submitter_uuids = Set.new(template_fields.pluck('submitter_uuid'))
|
||||
|
||||
viewer_template_submitters =
|
||||
submission.template_submitters.select { |s| field_submitter_uuids.exclude?(s['uuid']) }
|
||||
|
||||
return submission if viewer_template_submitters.blank?
|
||||
|
||||
viewer_template_submitters.each { |s| s['is_viewer'] = true }
|
||||
|
||||
return submission if submission.template_submitters.any? { |s| s['order'] }
|
||||
|
||||
first_submitter = submission.submitters.find(&:sent_at)
|
||||
|
||||
return submission unless first_submitter
|
||||
|
||||
submitters_index = submission.submitters.reject(&:completed_at?).index_by(&:uuid)
|
||||
|
||||
Submissions.find_first_viewers(first_submitter, submitters_index).each do |viewer|
|
||||
next if viewer.preferences['send_email'] == false || viewer.email.blank?
|
||||
|
||||
viewer.sent_at ||= first_submitter.sent_at
|
||||
end
|
||||
|
||||
submission
|
||||
end
|
||||
|
||||
def maybe_set_dynamic_documents(submission)
|
||||
return submission unless submission.template_id?
|
||||
|
||||
|
||||
@@ -282,6 +282,9 @@ module Submissions
|
||||
[
|
||||
composer.document.layout.formatted_text_box(
|
||||
[
|
||||
submitter.viewer? && {
|
||||
text: "#{I18n.t('view_only')}\n"
|
||||
},
|
||||
submitter.email && (click_email_event || verify_email_event) && {
|
||||
text: "#{I18n.t('email_verification')}: #{I18n.t('verified')}\n"
|
||||
},
|
||||
|
||||
@@ -996,7 +996,8 @@ module Submissions
|
||||
end
|
||||
|
||||
def single_sign_reason(submitter)
|
||||
signers = submitter.submission.submitters.sort_by(&:completed_at).map { |s| s.email || s.name || s.phone }
|
||||
signers = submitter.submission.submitters.reject(&:viewer?)
|
||||
.sort_by(&:completed_at).map { |s| s.email || s.name || s.phone }
|
||||
|
||||
format(SIGN_REASON, name: signers.reverse.join(', '))
|
||||
end
|
||||
@@ -1015,7 +1016,7 @@ module Submissions
|
||||
|
||||
return sign_reason(reason_name) if config.value == 'multiple'
|
||||
|
||||
if !submitter.submission.submitters.exists?(completed_at: nil) &&
|
||||
if submitter.submission.completed_at? &&
|
||||
submitter.completed_at == submitter.submission.submitters.maximum(:completed_at)
|
||||
return single_sign_reason(submitter)
|
||||
end
|
||||
|
||||
+11
-1
@@ -177,6 +177,7 @@ module Submitters
|
||||
end
|
||||
end
|
||||
|
||||
# rubocop:disable Metrics
|
||||
def current_submitter_order?(submitter)
|
||||
submission = submitter.submission
|
||||
|
||||
@@ -189,6 +190,14 @@ module Submitters
|
||||
current_group_index = submitter_groups.find_index { |_, group| group.any? { |s| s['uuid'] == submitter.uuid } }
|
||||
|
||||
submitter_groups.first(current_group_index).flat_map(&:last)
|
||||
elsif submitter.viewer?
|
||||
current_index = submitter_items.find_index { |e| e['uuid'] == submitter.uuid }
|
||||
|
||||
preceding_submitter_index = submitter_items[0...current_index].rindex do |e|
|
||||
!submission.submitters.find { |s| s.uuid == e['uuid'] }&.viewer?
|
||||
end
|
||||
|
||||
submitter_items.first(preceding_submitter_index || 0)
|
||||
else
|
||||
submitter_items.first(submitter_items.find_index { |e| e['uuid'] == submitter.uuid })
|
||||
end
|
||||
@@ -196,9 +205,10 @@ module Submitters
|
||||
before_items.all? do |item|
|
||||
submitter = submission.submitters.find { |e| e.uuid == item['uuid'] }
|
||||
|
||||
submitter.nil? || submitter.completed_at?
|
||||
submitter.nil? || submitter.viewer? || submitter.completed_at?
|
||||
end
|
||||
end
|
||||
# rubocop:enable Metrics
|
||||
|
||||
def build_document_filename(submitter, blob, filename_format)
|
||||
return blob.filename.to_s if filename_format.blank?
|
||||
|
||||
Reference in New Issue
Block a user