Files
docuseal/lib/submissions/create_from_submitters.rb
T

166 lines
6.2 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module Submissions
module CreateFromSubmitters
module_function
2023-11-23 20:03:52 +02:00
def call(template:, user:, submissions_attrs:, source:, submitters_order:, mark_as_sent: false, params: {})
2024-02-13 23:05:31 +02:00
preferences = Submitters.normalize_preferences(user.account, user, params)
2023-11-23 20:03:52 +02:00
2024-03-30 19:37:48 +02:00
Array.wrap(submissions_attrs).filter_map do |attrs|
2024-02-13 23:05:31 +02:00
submission_preferences = Submitters.normalize_preferences(user.account, user, attrs)
2023-12-02 23:16:38 +02:00
submission_preferences = preferences.merge(submission_preferences)
2024-01-10 02:06:31 +02:00
set_submission_preferences = submission_preferences.slice('send_email', 'bcc_completed')
2023-12-02 23:16:38 +02:00
set_submission_preferences['send_email'] = true if params['send_completed_email']
submission = template.submissions.new(created_by_user: user, source:,
2024-02-03 14:39:28 +02:00
account_id: user.account_id,
2023-12-02 23:16:38 +02:00
preferences: set_submission_preferences,
2023-11-30 12:31:37 +02:00
template_submitters: [], submitters_order:)
2023-10-12 00:06:33 +03:00
maybe_set_template_fields(submission, attrs[:submitters])
attrs[:submitters].each_with_index do |submitter_attrs, index|
2023-10-12 00:06:33 +03:00
uuid = find_submitter_uuid(template, submitter_attrs, index)
next if uuid.blank?
next if submitter_attrs.slice('email', 'phone', 'name').compact_blank.blank?
2023-11-30 12:31:37 +02:00
submission.template_submitters << template.submitters.find { |e| e['uuid'] == uuid }
is_order_sent = submitters_order == 'random' || index.zero?
2023-11-23 20:03:52 +02:00
build_submitter(submission:, attrs: submitter_attrs, uuid:,
is_order_sent:, mark_as_sent:, user:,
preferences: preferences.merge(submission_preferences))
end
2024-03-30 19:37:48 +02:00
next if submission.submitters.blank?
submission.tap(&:save!)
end
end
def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil)
2023-12-17 18:39:10 +02:00
template_fields = (submission.template_fields || submission.template.fields).deep_dup
2023-10-12 00:06:33 +03:00
submitters_attrs.each_with_index do |submitter_attrs, index|
submitter_uuid = default_submitter_uuid || find_submitter_uuid(submission.template, submitter_attrs, index)
2023-10-12 00:06:33 +03:00
2023-10-12 22:13:46 +03:00
process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid)
2023-12-29 18:54:48 +02:00
process_field_values_param(submitter_attrs[:values], template_fields, submitter_uuid)
2023-10-12 00:06:33 +03:00
2023-10-12 22:13:46 +03:00
process_fields_param(submitter_attrs[:fields], template_fields, submitter_uuid)
2023-10-12 00:06:33 +03:00
end
2024-03-20 23:42:54 +02:00
if template_fields != (submission.template_fields || submission.template.fields) ||
submitters_attrs.any? { |e| e[:completed].present? }
2023-10-12 00:06:33 +03:00
submission.template_fields = template_fields
submission.template_schema = submission.template.schema
end
submission
end
2023-10-12 22:13:46 +03:00
def process_readonly_fields_param(readonly_fields, template_fields, submitter_uuid)
return if readonly_fields.blank?
template_fields.each do |f|
next if f['submitter_uuid'] != submitter_uuid ||
(!f['name'].in?(readonly_fields) &&
2024-02-01 13:16:30 +02:00
!f['name'].to_s.downcase.in?(readonly_fields) &&
2023-10-13 14:17:28 +03:00
!f['name'].to_s.parameterize.underscore.in?(readonly_fields))
2023-10-12 22:13:46 +03:00
f['readonly'] = true
end
end
2023-12-29 18:54:48 +02:00
def process_field_values_param(values, template_fields, submitter_uuid)
return if values.blank?
template_fields.each do |f|
next if f['type'].in?(%w[signature image initials file])
next if f['submitter_uuid'] != submitter_uuid
2024-03-20 23:42:54 +02:00
next unless values.key?(f['uuid'])
2023-12-29 18:54:48 +02:00
2024-03-20 23:42:54 +02:00
value = values[f['uuid']]
2023-12-29 18:54:48 +02:00
2024-03-20 23:42:54 +02:00
if value.present?
f['default_value'] = value
else
f.delete('default_value')
end
2023-12-29 18:54:48 +02:00
end
end
2023-10-12 22:13:46 +03:00
def process_fields_param(fields, template_fields, submitter_uuid)
return if fields.blank?
template_fields.each do |f|
next if f['submitter_uuid'] != submitter_uuid
2023-10-13 14:17:28 +03:00
field_configs = fields.find do |e|
2024-02-01 13:16:30 +02:00
e['name'].to_s.casecmp(f['name'].to_s).zero? || e['name'] == f['name'].to_s.parameterize.underscore
2023-10-13 14:17:28 +03:00
end
2023-10-12 22:13:46 +03:00
next if field_configs.blank?
2024-01-13 13:15:08 +02:00
assign_field_attrs(f, field_configs)
end
end
2023-10-12 22:13:46 +03:00
2024-01-13 13:15:08 +02:00
def assign_field_attrs(field, attrs)
field['title'] = attrs['title'] if attrs['title'].present?
field['description'] = attrs['description'] if attrs['description'].present?
field['readonly'] = attrs['readonly'] if attrs.key?('readonly')
field['required'] = attrs['required'] if attrs.key?('required')
2024-02-08 20:12:08 +02:00
2024-03-20 23:42:54 +02:00
if attrs.key?('default_value') && !field['type'].in?(%w[signature image initials file])
if attrs['default_value'].present?
field['default_value'] = Submitters::NormalizeValues.normalize_value(field, attrs['default_value'])
else
field.delete('default_value')
end
2024-02-08 20:12:08 +02:00
end
2023-10-12 22:13:46 +03:00
2024-01-13 13:15:08 +02:00
return field if attrs['validation_pattern'].blank?
field['validation'] = {
'pattern' => attrs['validation_pattern'],
'message' => attrs['invalid_message']
}.compact_blank
field
2023-10-12 22:13:46 +03:00
end
2023-10-12 00:06:33 +03:00
def find_submitter_uuid(template, attrs, index)
2024-03-14 01:21:19 +02:00
uuid = attrs[:uuid].presence
uuid ||= template.submitters.find { |e| e['name'].to_s.casecmp(attrs[:role].to_s).zero? }&.dig('uuid')
uuid || template.submitters[index]&.dig('uuid')
2023-10-12 00:06:33 +03:00
end
2023-11-23 20:03:52 +02:00
def build_submitter(submission:, attrs:, uuid:, is_order_sent:, mark_as_sent:, user:, preferences:)
email = Submissions.normalize_email(attrs[:email])
2023-11-23 20:03:52 +02:00
submitter_preferences = Submitters.normalize_preferences(submission.account, user, attrs)
submission.submitters.new(
email:,
phone: attrs[:phone].to_s.gsub(/[^0-9+]/, ''),
name: attrs[:name],
2024-02-01 00:34:35 +02:00
external_id: attrs[:external_id].presence || attrs[:application_key],
2024-03-20 00:13:16 +02:00
completed_at: attrs[:completed].present? ? Time.current : nil,
sent_at: mark_as_sent && email.present? && is_order_sent ? Time.current : nil,
values: attrs[:values] || {},
2024-02-01 23:29:27 +02:00
metadata: attrs[:metadata] || {},
2023-12-29 18:54:48 +02:00
preferences: preferences.merge(submitter_preferences)
2024-01-10 02:06:31 +02:00
.merge({ default_values: attrs[:values] }.compact_blank)
.except('bcc_completed'),
uuid:
)
end
end
end