<% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %>
<% configs = Submitters::FormConfigs.call(submitter) %>
-
+
diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb
index 7b68b9db..721cf219 100644
--- a/app/views/submit_form/show.html.erb
+++ b/app/views/submit_form/show.html.erb
@@ -2,7 +2,6 @@
<% content_for(:html_description, "#{@submitter.account.name} has invited you to fill and sign documents online effortlessly with a secure, fast, and user-friendly digital document signing solution.") %>
<% fields_index = Templates.build_field_areas_index(@submitter.submission.template_fields || @submitter.submission.template.fields) %>
<% values = @submitter.submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } %>
-<% attachments_index = ActiveStorage::Attachment.where(record: @submitter.submission.submitters, name: :attachments).preload(:blob).index_by(&:uuid) %>
<% page_blob_struct = Struct.new(:url, :metadata, keyword_init: true) %>
@@ -29,7 +28,7 @@
<% next if field['redacted'] && field['submitter_uuid'] != @submitter.uuid %>
<% next if value == '{{date}}' && field['submitter_uuid'] != @submitter.uuid %>
<% next if field.dig('preferences', 'formula') && field['submitter_uuid'] == @submitter.uuid %>
- <%= render 'submissions/value', area:, field:, attachments_index:, value:, locale: @submitter.account.locale, timezone: @submitter.account.timezone %>
+ <%= render 'submissions/value', area:, field:, attachments_index: @attachments_index, value:, locale: @submitter.account.locale, timezone: @submitter.account.timezone %>
<% end %>
@@ -42,7 +41,7 @@
- <%= render 'submission_form', attachments_index:, submitter: @submitter %>
+ <%= render 'submission_form', attachments_index: @attachments_index, submitter: @submitter, signature_attachment: @signature_attachment %>
diff --git a/lib/submitters/maybe_assign_default_signature.rb b/lib/submitters/maybe_assign_default_signature.rb
new file mode 100644
index 00000000..fa8aaf6a
--- /dev/null
+++ b/lib/submitters/maybe_assign_default_signature.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+module Submitters
+ module MaybeAssignDefaultSignature
+ module_function
+
+ def call(submitter, params, attachments_index)
+ return if params[:t].present? && params[:t] != SubmissionEvents.build_tracking_param(submitter, 'click_email')
+ return if params[:t].blank? && !submitter.submission_events.exists?(event_type: :click_email)
+
+ signature_attachment = find_previous_signature(submitter)
+
+ return if signature_attachment.blank?
+
+ existing_attachment = attachments_index.values.find { |a| a.blob_id == signature_attachment.blob_id }
+
+ return existing_attachment if existing_attachment
+
+ attachment = submitter.attachments_attachments.create!(blob_id: signature_attachment.blob_id)
+
+ attachments_index[attachment.uuid] = attachment
+
+ attachment
+ end
+
+ def find_previous_signature(submitter)
+ return if submitter.email.blank?
+
+ submitters_query =
+ Submitter.where(email: submitter.email)
+ .where.not(completed_at: nil)
+ .where(SubmissionEvent.where(Submitter.arel_table[:id].eq(SubmissionEvent.arel_table[:submitter_id]))
+ .where(event_type: :click_email).limit(1).arel.exists)
+
+ ActiveStorage::Attachment.where(name: :signature, record: submitters_query).order(:id).last
+ end
+ end
+end
diff --git a/lib/submitters/submit_values.rb b/lib/submitters/submit_values.rb
index 9068f086..3e4f16a8 100644
--- a/lib/submitters/submit_values.rb
+++ b/lib/submitters/submit_values.rb
@@ -32,17 +32,7 @@ module Submitters
submitter.values.merge!(values)
submitter.opened_at ||= Time.current
- if params[:completed] == 'true'
- submitter.completed_at = Time.current
- submitter.ip = request.remote_ip
- submitter.ua = request.user_agent
- submitter.values = merge_default_values(submitter)
- submitter.values = merge_formula_values(submitter)
- submitter.values = maybe_remove_condition_values(submitter)
- submitter.values = submitter.values.transform_values do |v|
- v == '{{date}}' ? Time.current.in_time_zone(submitter.account.timezone).to_date.to_s : v
- end
- end
+ assign_completed_attributes(submitter, request) if params[:completed] == 'true'
ApplicationRecord.transaction do
validate_values!(values, submitter, params, request)
@@ -55,6 +45,29 @@ module Submitters
submitter
end
+ def assign_completed_attributes(submitter, request)
+ submitter.completed_at = Time.current
+ submitter.ip = request.remote_ip
+ submitter.ua = request.user_agent
+ submitter.values = merge_default_values(submitter)
+ submitter.values = merge_formula_values(submitter)
+ submitter.values = maybe_remove_condition_values(submitter)
+ submitter.values = submitter.values.transform_values do |v|
+ v == '{{date}}' ? Time.current.in_time_zone(submitter.account.timezone).to_date.to_s : v
+ end
+
+ signature_attachment =
+ submitter.submission.template_fields.reduce(nil) do |_, field|
+ next nil if field['submitter_uuid'] != submitter.uuid || field['type'] != 'signature'
+
+ break submitter.attachments_attachments.find_by(uuid: submitter.values[field['uuid']])
+ end
+
+ submitter.build_signature_attachment(blob_id: signature_attachment.blob_id) if signature_attachment
+
+ submitter
+ end
+
def normalized_values(params)
params.fetch(:values, {}).to_unsafe_h.transform_values do |v|
if params[:cast_boolean] == 'true'