From 858b2f33fdf68c1eccfd0f8a6020a236afb84b61 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Thu, 10 Apr 2025 00:56:16 +0300 Subject: [PATCH] ensure unique recipients --- app/controllers/submissions_controller.rb | 5 +++++ app/controllers/templates_preferences_controller.rb | 2 +- app/views/submissions/_error.html.erb | 7 +++++++ app/views/submissions/new.html.erb | 1 + app/views/templates_preferences/show.html.erb | 12 ++++++++++++ config/locales/i18n.yml | 6 ++++++ lib/submissions/create_from_submitters.rb | 6 ++++++ 7 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 app/views/submissions/_error.html.erb 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 '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)