diff --git a/app/controllers/submissions_controller.rb b/app/controllers/submissions_controller.rb
index 1dac63bd..0240b5be 100644
--- a/app/controllers/submissions_controller.rb
+++ b/app/controllers/submissions_controller.rb
@@ -57,6 +57,11 @@ class SubmissionsController < ApplicationController
Submissions.send_signature_requests(submissions)
redirect_to template_path(@template), notice: I18n.t('new_recipients_have_been_added')
+ rescue Submissions::CreateFromSubmitters::BaseError => e
+ render turbo_stream: turbo_stream.replace(:submitters_error,
+ partial: 'submissions/error',
+ locals: { error: e.message }),
+ status: :unprocessable_entity
end
def destroy
diff --git a/app/controllers/templates_preferences_controller.rb b/app/controllers/templates_preferences_controller.rb
index 78399e6a..07111a16 100644
--- a/app/controllers/templates_preferences_controller.rb
+++ b/app/controllers/templates_preferences_controller.rb
@@ -24,7 +24,7 @@ class TemplatesPreferencesController < ApplicationController
documents_copy_email_enabled documents_copy_email_attach_audit
documents_copy_email_attach_documents documents_copy_email_reply_to
completed_notification_email_attach_documents
- completed_redirect_url
+ completed_redirect_url validate_unique_submitters
submitters_order require_phone_2fa
completed_notification_email_subject completed_notification_email_body
completed_notification_email_enabled completed_notification_email_attach_audit] +
diff --git a/app/views/submissions/_error.html.erb b/app/views/submissions/_error.html.erb
new file mode 100644
index 00000000..1f95212b
--- /dev/null
+++ b/app/views/submissions/_error.html.erb
@@ -0,0 +1,7 @@
+
+ <% if local_assigns[:error] %>
+
+ <%= local_assigns[:error] %>
+
+ <% end %>
+
diff --git a/app/views/submissions/new.html.erb b/app/views/submissions/new.html.erb
index a7bcc8f6..b9874d75 100644
--- a/app/views/submissions/new.html.erb
+++ b/app/views/submissions/new.html.erb
@@ -28,6 +28,7 @@
<%= render 'list_form', template: @template %>
+ <%= render 'submissions/error' %>
<%= content_for(:modal_extra) %>
<% end %>
diff --git a/app/views/templates_preferences/show.html.erb b/app/views/templates_preferences/show.html.erb
index 270c6c24..d5010f34 100644
--- a/app/views/templates_preferences/show.html.erb
+++ b/app/views/templates_preferences/show.html.erb
@@ -335,6 +335,18 @@
<% end %>
<% end %>
+ <% if can?(:manage, :personalization_advanced) %>
+ <%= form_for @template, url: template_preferences_path(@template), method: :post, html: { autocomplete: 'off', class: 'mt-2' }, data: { close_on_submit: false } do |f| %>
+
+
+ <%= t('ensure_unique_recipients') %>
+
+ <%= f.fields_for :preferences, Struct.new(:validate_unique_submitters).new(@template.preferences['validate_unique_submitters']) do |ff| %>
+ <%= ff.check_box :validate_unique_submitters, { class: 'toggle', onchange: 'this.form.requestSubmit()' }, 'true', '' %>
+ <% end %>
+
+ <% end %>
+ <% end %>
<%= button_tag button_title(title: t('save'), disabled_with: t('updating')), class: 'base-button', form: :submitters_form %>
diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml
index 277e3344..952ff3b9 100644
--- a/config/locales/i18n.yml
+++ b/config/locales/i18n.yml
@@ -22,6 +22,7 @@ en: &en
thanks: Thanks
bcc_recipients: BCC recipients
always_enforce_signing_order: Always enforce the signing order
+ ensure_unique_recipients: Ensure unique recipients
edit_per_party: Edit per party
reply_to: Reply to
pending_by_me: Pending by me
@@ -795,6 +796,7 @@ en: &en
read: Read your data
es: &es
+ ensure_unique_recipients: Asegurar destinatarios únicos
require_phone_2fa_to_open: Requiere 2FA por teléfono para abrir
the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: El remitente ha solicitado una autenticación de dos factores mediante una contraseña de un solo uso enviada a su número de teléfono %{phone}.
send_verification_code: Enviar código de verificación
@@ -1572,6 +1574,7 @@ es: &es
read: Leer tus datos
it: &it
+ ensure_unique_recipients: Assicurarsi destinatari unici
require_phone_2fa_to_open: Richiedi l'autenticazione a due fattori tramite telefono per aprire
the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Il mittente ha richiesto un'autenticazione a due fattori tramite una password monouso inviata al tuo numero di telefono %{phone}.
send_verification_code: Invia codice di verifica
@@ -2348,6 +2351,7 @@ it: &it
read: Leggi i tuoi dati
fr: &fr
+ ensure_unique_recipients: Assurer l'unicité des destinataires
require_phone_2fa_to_open: Requiert une 2FA par téléphone pour ouvrir
the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: L'expéditeur a demandé une authentification à deux facteurs via un mot de passe à usage unique envoyé à votre numéro de téléphone %{phone}.
send_verification_code: Envoyer le code de vérification
@@ -3126,6 +3130,7 @@ fr: &fr
read: Lire vos données
pt: &pt
+ ensure_unique_recipients: Garantir destinatários únicos
require_phone_2fa_to_open: Necessário autenticação de dois fatores via telefone para abrir
the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: O remetente solicitou uma autenticação de dois fatores via senha de uso único enviada para seu número %{phone}.
send_verification_code: Enviar código de verificação
@@ -3904,6 +3909,7 @@ pt: &pt
read: Ler seus dados
de: &de
+ ensure_unique_recipients: Stellen Sie einzigartige Empfänger sicher
require_phone_2fa_to_open: Telefon-2FA zum Öffnen erforderlich
the_sender_has_requested_a_two_factor_authentication_via_one_time_password_sent_to_your_html: Der Absender hat eine Zwei-Faktor-Authentifizierung per Einmalpasswort angefordert, das an Ihre %{phone}-Telefonnummer gesendet wurde.
send_verification_code: Bestätigungscode senden
diff --git a/lib/submissions/create_from_submitters.rb b/lib/submissions/create_from_submitters.rb
index 6801aa13..a0c274fa 100644
--- a/lib/submissions/create_from_submitters.rb
+++ b/lib/submissions/create_from_submitters.rb
@@ -65,6 +65,12 @@ module Submissions
raise BaseError, 'Defined more signing parties than in template'
end
+ if template.preferences['validate_unique_submitters'] == true
+ submission_emails = submission.submitters.filter_map(&:email)
+
+ raise BaseError, 'Recipient emails should differ' if submission_emails.uniq.size != submission_emails.size
+ end
+
next if submission.submitters.blank?
maybe_add_invite_submitters(submission, template)