|  |  | @ -23,15 +23,33 @@ module Submissions | 
			
		
	
		
		
			
				
					
					|  |  |  |                                               expire_at: attrs[:expire_at], |  |  |  |                                               expire_at: attrs[:expire_at], | 
			
		
	
		
		
			
				
					
					|  |  |  |                                               template_submitters: [], submitters_order:) |  |  |  |                                               template_submitters: [], submitters_order:) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         maybe_set_template_fields(submission, attrs[:submitters]) |  |  |  |         template_submitters = template.submitters.deep_dup | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         attrs[:submitters].each_with_index do |submitter_attrs, index| |  |  |  |         attrs[:submitters].each_with_index do |submitter_attrs, index| | 
			
		
	
		
		
			
				
					
					|  |  |  |           uuid = find_submitter_uuid(template, submitter_attrs, index) |  |  |  |           if submitter_attrs[:roles].present? && submitter_attrs[:roles].size > 1 | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             template_submitter, template_submitters, submission.template_fields = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |               merge_submitters_and_fields(submitter_attrs, template_submitters, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                           submission.template_fields || submission.template.fields) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             submission.template_schema = submission.template.schema if submission.template_schema.blank? | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             uuid = template_submitter['uuid'] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if submitter_attrs[:roles].present? && submitter_attrs[:roles].size == 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |               submitter_attrs[:role] = submitter_attrs[:roles].first | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             uuid = find_submitter_uuid(template_submitters, submitter_attrs, index) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           next if uuid.blank? |  |  |  |             next if uuid.blank? | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |           next if submitter_attrs.slice('email', 'phone', 'name').compact_blank.blank? |  |  |  |             next if submitter_attrs.slice('email', 'phone', 'name').compact_blank.blank? | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             submission.template_fields = submission.template.fields if submitter_attrs[:completed].present? && | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                                                        submission.template_fields.blank? | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             template_submitter = template_submitters.find { |e| e['uuid'] == uuid } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           template_submitter = template.submitters.find { |e| e['uuid'] == uuid } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |           submission.template_submitters << template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid') |  |  |  |           submission.template_submitters << template_submitter.except('optional_invite_by_uuid', 'invite_by_uuid') | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |           is_order_sent = submitters_order == 'random' || index.zero? |  |  |  |           is_order_sent = submitters_order == 'random' || index.zero? | 
			
		
	
	
		
		
			
				
					|  |  | @ -41,6 +59,8 @@ module Submissions | 
			
		
	
		
		
			
				
					
					|  |  |  |                           preferences: preferences.merge(submission_preferences)) |  |  |  |                           preferences: preferences.merge(submission_preferences)) | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         maybe_set_template_fields(submission, attrs[:submitters]) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if submission.submitters.size > template.submitters.size |  |  |  |         if submission.submitters.size > template.submitters.size | 
			
		
	
		
		
			
				
					
					|  |  |  |           raise BaseError, 'Defined more signing parties than in template' |  |  |  |           raise BaseError, 'Defined more signing parties than in template' | 
			
		
	
		
		
			
				
					
					|  |  |  |         end |  |  |  |         end | 
			
		
	
	
		
		
			
				
					|  |  | @ -94,8 +114,10 @@ module Submissions | 
			
		
	
		
		
			
				
					
					|  |  |  |     def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil) |  |  |  |     def maybe_set_template_fields(submission, submitters_attrs, default_submitter_uuid: nil) | 
			
		
	
		
		
			
				
					
					|  |  |  |       template_fields = (submission.template_fields || submission.template.fields).deep_dup |  |  |  |       template_fields = (submission.template_fields || submission.template.fields).deep_dup | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       submitters = submission.template_submitters || submission.template.submitters | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       submitters_attrs.each_with_index do |submitter_attrs, index| |  |  |  |       submitters_attrs.each_with_index do |submitter_attrs, index| | 
			
		
	
		
		
			
				
					
					|  |  |  |         submitter_uuid = default_submitter_uuid || find_submitter_uuid(submission.template, submitter_attrs, index) |  |  |  |         submitter_uuid = default_submitter_uuid || find_submitter_uuid(submitters, submitter_attrs, index) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid) |  |  |  |         process_readonly_fields_param(submitter_attrs[:readonly_fields], template_fields, submitter_uuid) | 
			
		
	
		
		
			
				
					
					|  |  |  |         process_field_values_param(submitter_attrs[:values], template_fields, submitter_uuid) |  |  |  |         process_field_values_param(submitter_attrs[:values], template_fields, submitter_uuid) | 
			
		
	
	
		
		
			
				
					|  |  | @ -112,6 +134,65 @@ module Submissions | 
			
		
	
		
		
			
				
					
					|  |  |  |       submission |  |  |  |       submission | 
			
		
	
		
		
			
				
					
					|  |  |  |     end |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     def merge_submitters_and_fields(submitter_attrs, template_submitters, template_fields) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       selected_submitters = submitter_attrs[:roles].map do |role| | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         template_submitters.find { |e| e['name'].to_s.casecmp(role).zero? } || | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           raise(BaseError, "#{role} role doesn't exist") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       merge_role_uuids = selected_submitters.pluck('uuid') | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       old_role_uuids = template_submitters.pluck('uuid') | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       name = submitter_attrs[:role].presence || selected_submitters.pluck('name').join(' / ') | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       merged_submitter, template_submitters = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         build_merged_submitter(template_submitters, role_uuids: merge_role_uuids, name:) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       field_names_index = {} | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       sorted_fields = template_fields.sort_by { |e| old_role_uuids.index(e['submitter_uuid']) } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       sorted_fields.each do |field| | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         next unless merge_role_uuids.include?(field['submitter_uuid']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if (existing_field = field_names_index[field['name']]) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           existing_field['areas'] ||= [] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           existing_field['areas'].push(*field['areas']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           template_fields.delete(field) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         else | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           field['submitter_uuid'] = merged_submitter['uuid'] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           field_names_index[field['name']] = field if field['name'].present? | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       [merged_submitter, template_submitters, template_fields] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     def build_merged_submitter(submitters, role_uuids:, name:) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       new_uuid = Digest::UUID.uuid_v5(Digest::UUID::OID_NAMESPACE, role_uuids.sort.join(':')) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       merged_submitter = nil | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       submitters = | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         submitters.filter_map do |submitter| | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           submitter['optional_invite_by_uuid'] = new_uuid if role_uuids.include?(submitter['optional_invite_by_uuid']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           submitter['invite_by_uuid'] = new_uuid if role_uuids.include?(submitter['invite_by_uuid']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           submitter['linked_to_uuid'] = new_uuid if role_uuids.include?(submitter['linked_to_uuid']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           if role_uuids.include?(submitter['uuid']) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             next if merged_submitter | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             merged_submitter = submitter.deep_dup | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             merged_submitter['uuid'] = new_uuid | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             merged_submitter['name'] = name | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             merged_submitter.delete('linked_to_uuid') | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           submitter | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       [merged_submitter, submitters] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     def process_readonly_fields_param(readonly_fields, template_fields, submitter_uuid) |  |  |  |     def process_readonly_fields_param(readonly_fields, template_fields, submitter_uuid) | 
			
		
	
		
		
			
				
					
					|  |  |  |       return if readonly_fields.blank? |  |  |  |       return if readonly_fields.blank? | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -190,11 +271,11 @@ module Submissions | 
			
		
	
		
		
			
				
					
					|  |  |  |       field |  |  |  |       field | 
			
		
	
		
		
			
				
					
					|  |  |  |     end |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     def find_submitter_uuid(template, attrs, index) |  |  |  |     def find_submitter_uuid(submitters, attrs, index) | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       uuid = attrs[:uuid].presence |  |  |  |       uuid = attrs[:uuid].presence | 
			
		
	
		
		
			
				
					
					|  |  |  |       uuid ||= template.submitters.find { |e| e['name'].to_s.casecmp(attrs[:role].to_s).zero? }&.dig('uuid') |  |  |  |       uuid ||= submitters.find { |e| e['name'].to_s.casecmp(attrs[:role].to_s).zero? }&.dig('uuid') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       uuid || template.submitters[index]&.dig('uuid') |  |  |  |       uuid || submitters[index]&.dig('uuid') | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     end |  |  |  |     end | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     def build_submitter(submission:, attrs:, uuid:, is_order_sent:, user:, preferences:, params:) |  |  |  |     def build_submitter(submission:, attrs:, uuid:, is_order_sent:, user:, preferences:, params:) | 
			
		
	
	
		
		
			
				
					|  |  | 
 |