diff --git a/app/controllers/account_configs_controller.rb b/app/controllers/account_configs_controller.rb index 1130feef..02aee521 100644 --- a/app/controllers/account_configs_controller.rb +++ b/app/controllers/account_configs_controller.rb @@ -17,7 +17,8 @@ class AccountConfigsController < ApplicationController AccountConfig::FLATTEN_RESULT_PDF_KEY, AccountConfig::WITH_SIGNATURE_ID, AccountConfig::COMBINE_PDF_RESULT_KEY, - AccountConfig::REQUIRE_SIGNING_REASON_KEY + AccountConfig::REQUIRE_SIGNING_REASON_KEY, + AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY ].freeze InvalidKey = Class.new(StandardError) diff --git a/app/controllers/submissions_download_controller.rb b/app/controllers/submissions_download_controller.rb index 2a6517a9..47c5fa47 100644 --- a/app/controllers/submissions_download_controller.rb +++ b/app/controllers/submissions_download_controller.rb @@ -53,8 +53,13 @@ class SubmissionsDownloadController < ApplicationController end def build_urls(submitter) + filename_format = AccountConfig.find_or_initialize_by(account_id: submitter.account_id, + key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY)&.value + Submitters.select_attachments_for_download(submitter).map do |attachment| - ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i) + ActiveStorage::Blob.proxy_url(attachment.blob, + expires_at: FILES_TTL.from_now.to_i, + filename: build_filename(submitter, attachment.blob, filename_format)) end end @@ -65,6 +70,26 @@ class SubmissionsDownloadController < ApplicationController attachment = submitter.submission.combined_document_attachment attachment ||= Submissions::GenerateCombinedAttachment.call(submitter) - ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i) + filename_format = AccountConfig.find_or_initialize_by(account_id: submitter.account_id, + key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY)&.value + + ActiveStorage::Blob.proxy_url(attachment.blob, + expires_at: FILES_TTL.from_now.to_i, + filename: build_filename(submitter, attachment.blob, filename_format)) + end + + def build_filename(submitter, blob, filename_format) + return blob.filename if filename_format.blank? + + filename = ReplaceEmailVariables.call(filename_format, submitter:) + + filename = filename.gsub('{document.name}', blob.filename.base) + + filename = filename.gsub( + '{submission.completed_at}', + I18n.l(submitter.completed_at.beginning_of_year.in_time_zone(submitter.account.timezone), format: :short) + ) + + "#{filename}.#{blob.filename.extension}" end end diff --git a/app/models/account_config.rb b/app/models/account_config.rb index 112ca466..6ce4ef46 100644 --- a/app/models/account_config.rb +++ b/app/models/account_config.rb @@ -43,6 +43,7 @@ class AccountConfig < ApplicationRecord REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason' REUSE_SIGNATURE_KEY = 'reuse_signature' COMBINE_PDF_RESULT_KEY = 'combine_pdf_result_key' + DOCUMENT_FILENAME_FORMAT_KEY = 'document_filename_format' DEFAULT_VALUES = { SUBMITTER_INVITATION_EMAIL_KEY => lambda { diff --git a/app/views/esign_settings/show.html.erb b/app/views/esign_settings/show.html.erb index 8d2d3b72..848dd740 100644 --- a/app/views/esign_settings/show.html.erb +++ b/app/views/esign_settings/show.html.erb @@ -164,6 +164,20 @@ <% end %> <% end %> + <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY) %> + <% if can?(:manage, account_config) %> + <%= form_for account_config, url: account_configs_path, method: :post do |f| %> + <%= f.hidden_field :key %> +
+ + <%= t('document_download_filename_format') %> + +
+ <%= f.select :value, [["#{I18n.t('document_name')}.pdf", '{document.name}'], ["#{I18n.t('document_name')} - name@domain.com.pdf", '{document.name} - {submission.submitters}'], ["#{I18n.t('document_name')} - name@domain.com - #{I18n.l(Time.current.beginning_of_year.in_time_zone(current_account.timezone), format: :short)}.pdf", '{document.name} - {submission.submitters} - {submission.completed_at}']], {}, class: 'base-select', onchange: 'this.form.requestSubmit()' %> +
+
+ <% end %> + <% end %> <% end %> diff --git a/config/initializers/active_storage.rb b/config/initializers/active_storage.rb index 81c7240c..e89b1437 100644 --- a/config/initializers/active_storage.rb +++ b/config/initializers/active_storage.rb @@ -13,9 +13,9 @@ end ActiveSupport.on_load(:active_storage_blob) do attribute :uuid, :string, default: -> { SecureRandom.uuid } - def self.proxy_url(blob, expires_at: nil) + def self.proxy_url(blob, expires_at: nil, filename: nil) Rails.application.routes.url_helpers.blobs_proxy_url( - signed_uuid: blob.signed_uuid(expires_at:), filename: blob.filename, + signed_uuid: blob.signed_uuid(expires_at:), filename: filename || blob.filename, **Docuseal.default_url_options ) end diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml index 788bf704..ab88c44b 100644 --- a/config/locales/i18n.yml +++ b/config/locales/i18n.yml @@ -22,6 +22,8 @@ en: &en thanks: Thanks unarchive: Unarchive first_party: 'First Party' + document_download_filename_format: Document download filename format + document_name: Document Name docuseal_trusted_signature: DocuSeal Trusted Signature hello_name: Hello %{name} you_are_invited_to_product_name: You are invited to %{product_name} @@ -667,6 +669,8 @@ en: &en read: Read your data es: &es + document_download_filename_format: Formato del nombre del archivo de descarga del documento + document_name: Nombre del documento unarchive: Desarchivar awaiting_completion_by_the_other_party: "Esperando la finalización por la otra parte" enforce_recipients_order: 'Hacer cumplir el orden de los destinatarios' @@ -1316,6 +1320,8 @@ es: &es read: Leer tus datos it: &it + document_download_filename_format: Formato del nome file scaricato + document_name: Nome del Documento unarchive: Ripristina awaiting_completion_by_the_other_party: "In attesa di completamento da parte dell'altra parte" enforce_recipients_order: Aplicar el orden de los destinatarios @@ -1965,6 +1971,8 @@ it: &it read: Leggi i tuoi dati fr: &fr + document_download_filename_format: Format du nom de fichier du téléchargement de document + document_name: Nom du document unarchive: Désarchiver awaiting_completion_by_the_other_party: "En attente de la complétion par l'autre partie" enforce_recipients_order: "Respecter l'ordre des destinataires" @@ -2615,6 +2623,8 @@ fr: &fr read: Lire vos données pt: &pt + document_download_filename_format: Formato do nome do arquivo de download do documento + document_name: Nome do documento unarchive: Desarquivar awaiting_completion_by_the_other_party: "Aguardando a conclusão pela outra parte" enforce_recipients_order: 'Forçar a ordem dos recipientes' @@ -3264,6 +3274,8 @@ pt: &pt read: Ler seus dados de: &de + document_download_filename_format: Format des Dateinamens beim Herunterladen von Dokumenten + document_name: Dokumentname unarchive: Wiederherstellen awaiting_completion_by_the_other_party: "Warten auf die Fertigstellung durch die andere Partei" enforce_recipients_order: 'Empfängerreihenfolge durchsetzen'