<%= ff.label :subject, t('subject'), class: 'label' %>
diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb
index fff9f56f..3256ad36 100644
--- a/app/views/submissions/show.html.erb
+++ b/app/views/submissions/show.html.erb
@@ -19,6 +19,11 @@
<%= svg_icon('external_link', class: 'w-6 h-6') %>
+ <% else %>
+ <%= link_to submission_events_path(@submission), class: 'white-button', data: { turbo_frame: :modal } do %>
+ <%= svg_icon('logs', class: 'w-6 h-6') %>
+
+ <% end %>
<% end %>
<% if last_submitter %>
<% if is_all_completed || !is_combined_enabled %>
diff --git a/app/views/submit_form/_annotations.html.erb b/app/views/submit_form/_annotations.html.erb
new file mode 100644
index 00000000..f4fbaaff
--- /dev/null
+++ b/app/views/submit_form/_annotations.html.erb
@@ -0,0 +1 @@
+<%= render partial: 'submissions/annotation', collection: annots, as: :annot %>
diff --git a/app/views/submit_form/show.html.erb b/app/views/submit_form/show.html.erb
index 28f94fef..02967492 100644
--- a/app/views/submit_form/show.html.erb
+++ b/app/views/submit_form/show.html.erb
@@ -47,8 +47,8 @@
- <% document_annots_index[index]&.each do |annot| %>
- <%= render 'submissions/annotation', annot: %>
+ <% if annots = document_annots_index[index] %>
+ <%= render 'submit_form/annotations', annots: %>
<% end %>
<% fields_index.dig(document.uuid, index)&.each do |(area, field)| %>
<% value = values[field['uuid']].presence || (field['default_value'].present? ? Submitters::SubmitValues.template_default_value_for_submitter(field['default_value'], @submitter.submission.submitters.find { |e| e.uuid == field['submitter_uuid'] }, with_time: false) : nil) %>
diff --git a/config/locales/i18n.yml b/config/locales/i18n.yml
index 924d46fd..e39a0ce4 100644
--- a/config/locales/i18n.yml
+++ b/config/locales/i18n.yml
@@ -695,6 +695,17 @@ en: &en
overdue_payment: Overdue Payment
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Your Pro Plan has been suspended due to unpaid invoices. You can update your payment details to settle the invoice and continue using DocuSeal or cancel your subscription.
manage_subscription: Manage Subscription
+ submission_created_by_email_html: 'Submission created by %{email}'
+ submission_created_by_email_via_source_html: 'Submission created by %{email} via %{source}'
+ submission_created_via_source_html: 'Submission created via %{source}'
+ pro_user_seats_used: Pro user seats used
+ manage_plan: Manage plan
+ submission_sources:
+ api: API
+ bulk: Bulk Send
+ embed: Embedding
+ invie: Invite
+ link: Link
submission_event_names:
send_email_to_html: 'Email sent to %{submitter_name}'
send_reminder_email_to_html: 'Reminder email sent to %{submitter_name}'
@@ -1410,6 +1421,17 @@ es: &es
overdue_payment: Pago Atrasado
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Tu plan Pro ha sido suspendido debido a facturas impagas. Puedes actualizar tus datos de pago para liquidar la factura y seguir usando DocuSeal o cancelar tu suscripción.
manage_subscription: Gestionar Suscripción
+ submission_created_by_email_html: 'Envío creado por %{email}'
+ submission_created_by_email_via_source_html: 'Envío creado por %{email} a través de %{source}'
+ submission_created_via_source_html: 'Envío creado a través de %{source}'
+ pro_user_seats_used: Plazas de usuario Pro en uso
+ manage_plan: Gestionar plan
+ submission_sources:
+ api: API
+ bulk: Envío masivo
+ embed: Integración
+ invite: Invitación
+ link: Enlace
submission_event_names:
send_email_to_html: 'Correo electrónico enviado a %{submitter_name}'
send_reminder_email_to_html: 'Correo de recordatorio enviado a %{submitter_name}'
@@ -2124,6 +2146,17 @@ it: &it
overdue_payment: Pagamento Scaduto
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Il tuo piano Pro è stato sospeso a causa di fatture non pagate. Puoi aggiornare i tuoi dati di pagamento per saldare la fattura e continuare a utilizzare DocuSeal o annullare l'abbonamento.
manage_subscription: Gestisci Abbonamento
+ submission_created_by_email_html: 'Invio creato da %{email}'
+ submission_created_by_email_via_source_html: 'Invio creato da %{email} tramite %{source}'
+ submission_created_via_source_html: 'Invio creato tramite %{source}'
+ pro_user_seats_used: Posti utente Pro in uso
+ manage_plan: Gestisci piano
+ submission_sources:
+ api: API
+ bulk: Invio massivo
+ embed: Incorporamento
+ invite: Invito
+ link: Link
submission_event_names:
send_email_to_html: 'E-mail inviato a %{submitter_name}'
send_reminder_email_to_html: 'E-mail di promemoria inviato a %{submitter_name}'
@@ -2840,6 +2873,17 @@ fr: &fr
overdue_payment: Paiement En Retard
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Votre plan Pro a été suspendu en raison de factures impayées. Vous pouvez mettre à jour vos informations de paiement pour régler la facture et continuer à utiliser DocuSeal ou annuler votre abonnement.
manage_subscription: Gérer l'Abonnement
+ submission_created_by_email_html: 'Soumission créée par %{email}'
+ submission_created_by_email_via_source_html: 'Soumission créée par %{email} via %{source}'
+ submission_created_via_source_html: 'Soumission créée via %{source}'
+ pro_user_seats_used: Places utilisateur Pro en cours d'utilisation
+ manage_plan: Gérer le plan
+ submission_sources:
+ api: API
+ bulk: Envoi en masse
+ embed: Intégration
+ invite: Invitation
+ link: Lien
submission_event_names:
send_email_to_html: 'E-mail envoyé à %{submitter_name}'
send_reminder_email_to_html: 'E-mail de rappel envoyé à %{submitter_name}'
@@ -3555,6 +3599,17 @@ pt: &pt
overdue_payment: Pagamento Atrasado
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Seu plano Pro foi suspenso devido a faturas não pagas. Você pode atualizar seus dados de pagamento para quitar a fatura e continuar usando o DocuSeal ou cancelar sua assinatura.
manage_subscription: Gerenciar Assinatura
+ submission_created_by_email_html: 'Envio criado por %{email}'
+ submission_created_by_email_via_source_html: 'Envio criado por %{email} via %{source}'
+ submission_created_via_source_html: 'Envio criado via %{source}'
+ pro_user_seats_used: Lugares de usuário Pro em uso
+ manage_plan: Gerenciar plano
+ submission_sources:
+ api: API
+ bulk: Envio em massa
+ embed: Incorporação
+ invite: Convite
+ link: Link
submission_event_names:
send_email_to_html: 'E-mail enviado para %{submitter_name}'
send_reminder_email_to_html: 'E-mail de lembrete enviado para %{submitter_name}'
@@ -4270,6 +4325,17 @@ de: &de
overdue_payment: Überfällige Zahlung
your_pro_plan_has_been_suspended_due_to_unpaid_invoices_you_can_update_your_payment_details_to_settle_the_invoice_and_continue_using_docuseal_or_cancel_your_subscription: Ihr Pro-Plan wurde aufgrund unbezahlter Rechnungen ausgesetzt. Sie können Ihre Zahlungsdaten aktualisieren, um die Rechnung zu begleichen und DocuSeal weiterhin zu nutzen, oder Ihr Abonnement kündigen.
manage_subscription: Abonnement Verwalten
+ submission_created_by_email_html: 'Übermittlung erstellt von %{email}'
+ submission_created_by_email_via_source_html: 'Übermittlung erstellt durch %{email} über %{source}'
+ submission_created_via_source_html: 'Übermittlung erstellt über %{source}'
+ pro_user_seats_used: Verwendete Pro-Benutzerplätze
+ manage_plan: Plan verwalten
+ submission_sources:
+ api: API
+ bulk: Massenversand
+ embed: Einbettung
+ invite: Einladung
+ link: Link
submission_event_names:
send_email_to_html: 'E-Mail gesendet an %{submitter_name}'
send_reminder_email_to_html: 'Erinnerungs-E-Mail gesendet an %{submitter_name}'
diff --git a/config/routes.rb b/config/routes.rb
index d4d792c6..7e24097b 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -72,6 +72,7 @@ Rails.application.routes.draw do
resources :submissions, only: %i[index], controller: 'submissions_dashboard'
resources :submissions, only: %i[show destroy] do
resources :unarchive, only: %i[create], controller: 'submissions_unarchive'
+ resources :events, only: %i[index], controller: 'submission_events'
end
resources :submitters, only: %i[edit update]
resources :console_redirect, only: %i[index]
diff --git a/lib/submissions/generate_combined_attachment.rb b/lib/submissions/generate_combined_attachment.rb
index e5dfc892..4e996634 100644
--- a/lib/submissions/generate_combined_attachment.rb
+++ b/lib/submissions/generate_combined_attachment.rb
@@ -23,9 +23,15 @@ module Submissions
**Submissions::GenerateResultAttachments.build_signing_params(submitter, pkcs, tsa_url)
}
- pdf.sign(io, **sign_params)
+ begin
+ pdf.sign(io, **sign_params)
+ rescue HexaPDF::MalformedPDFError => e
+ Rollbar.error(e) if defined?(Rollbar)
+
+ pdf.sign(io, write_options: { incremental: false }, **sign_params)
+ end
else
- pdf.write(io)
+ pdf.write(io, incremental: true, validate: false)
end
Submissions::GenerateResultAttachments.maybe_enable_ltv(io, sign_params)
diff --git a/lib/submissions/generate_result_attachments.rb b/lib/submissions/generate_result_attachments.rb
index a5941863..3039ac19 100644
--- a/lib/submissions/generate_result_attachments.rb
+++ b/lib/submissions/generate_result_attachments.rb
@@ -23,6 +23,7 @@ module Submissions
A4_SIZE = [595, 842].freeze
TESTING_FOOTER = 'Testing Document - NOT LEGALLY BINDING'
+ DEFAULT_FONTS = %w[Times Helvetica Courier].freeze
MISSING_GLYPH_REPLACE = {
'▪' => '-',
@@ -190,7 +191,8 @@ module Submissions
fill_color = field.dig('preferences', 'color').presence
- font_name = field.dig('preferences', 'font').presence || FONT_NAME
+ font_name = field.dig('preferences', 'font')
+ font_name = FONT_NAME unless font_name.in?(DEFAULT_FONTS)
font = pdf.fonts.add(font_name)
value = submitter.values[field['uuid']]
diff --git a/lib/templates/clone.rb b/lib/templates/clone.rb
index cd1118a3..6210354d 100644
--- a/lib/templates/clone.rb
+++ b/lib/templates/clone.rb
@@ -32,6 +32,7 @@ module Templates
template
end
+ # rubocop:disable Metrics, Style/CombinableLoops
def update_submitters_and_fields_and_schema(cloned_submitters, cloned_fields, cloned_schema)
submitter_uuids_replacements = {}
field_uuids_replacements = {}
@@ -43,6 +44,20 @@ module Templates
submitter['uuid'] = new_submitter_uuid
end
+ cloned_submitters.each do |submitter|
+ if submitter['optional_invite_by_uuid'].present?
+ submitter['optional_invite_by_uuid'] = submitter_uuids_replacements[submitter['optional_invite_by_uuid']]
+ end
+
+ if submitter['invite_by_uuid'].present?
+ submitter['invite_by_uuid'] = submitter_uuids_replacements[submitter['invite_by_uuid']]
+ end
+
+ if submitter['linked_to_uuid'].present?
+ submitter['linked_to_uuid'] = submitter_uuids_replacements[submitter['linked_to_uuid']]
+ end
+ end
+
cloned_fields.each do |field|
new_field_uuid = SecureRandom.uuid
@@ -75,5 +90,6 @@ module Templates
[cloned_submitters, cloned_fields, cloned_schema]
end
+ # rubocop:enable Metrics, Style/CombinableLoops
end
end
diff --git a/spec/factories/templates.rb b/spec/factories/templates.rb
index 0f737512..8f619353 100644
--- a/spec/factories/templates.rb
+++ b/spec/factories/templates.rb
@@ -9,6 +9,7 @@ FactoryBot.define do
transient do
submitter_count { 1 }
+ attachment_count { 1 }
only_field_types do
%w[text date checkbox radio signature number multiple select initials image file stamp cells phone payment]
end
@@ -16,20 +17,6 @@ FactoryBot.define do
end
after(:create) do |template, ev|
- blob = ActiveStorage::Blob.create_and_upload!(
- io: Rails.root.join('spec/fixtures/sample-document.pdf').open,
- filename: 'sample-document.pdf',
- content_type: 'application/pdf'
- )
- attachment = ActiveStorage::Attachment.create!(
- blob:,
- name: :documents,
- record: template
- )
-
- Templates::ProcessDocument.call(attachment, attachment.download)
-
- template.schema = [{ attachment_uuid: attachment.uuid, name: 'sample-document' }]
number_words = %w[first second third fourth fifth sixth seventh eighth ninth tenth]
template.submitters = Array.new(ev.submitter_count) do |i|
@@ -39,296 +26,319 @@ FactoryBot.define do
}
end
- template.fields = template.submitters.reduce([]) do |fields, submitter|
- fields += [
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'First Name',
- 'type' => 'text',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.09273546006944444,
- 'y' => 0.1099851117387033,
- 'w' => 0.2701497395833333,
- 'h' => 0.0372705365913556,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Birthday',
- 'type' => 'date',
- 'required' => true,
- 'preferences' => { 'format' => 'DD/MM/YYYY' },
- 'areas' => [
- {
- 'x' => 0.09166666666666666,
- 'y' => 0.1762778204144282,
- 'w' => 0.2763888888888889,
- 'h' => 0.0359029261474578,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Do you agree?',
- 'type' => 'checkbox',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.09051106770833334,
- 'y' => 0.227587027259332,
- 'w' => 0.2784450954861111,
- 'h' => 0.04113074042239687,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'First child',
- 'type' => 'radio',
- 'required' => true,
- 'preferences' => {},
- 'options' => [
- { 'value' => 'Girl', 'uuid' => SecureRandom.uuid },
- { 'value' => 'Boy', 'uuid' => SecureRandom.uuid }
- ],
- 'areas' => [
- {
- 'x' => 0.09027777777777778,
- 'y' => 0.3020184190330008,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Signature',
- 'type' => 'signature',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.08611111111111111,
- 'y' => 0.3487183422870299,
- 'w' => 0.2,
- 'h' => 0.0707269155206287,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'House number',
- 'type' => 'number',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.08333333333333333,
- 'y' => 0.4582041442824252,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Colors',
- 'type' => 'multiple',
- 'required' => true,
- 'preferences' => {},
- 'options' => [
- { 'value' => 'Red', 'uuid' => SecureRandom.uuid },
- { 'value' => 'Green', 'uuid' => SecureRandom.uuid },
- { 'value' => 'Blue', 'uuid' => SecureRandom.uuid }
- ],
- 'areas' => [
- {
- 'x' => 0.45,
- 'y' => 0.1133998465080583,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Gender',
- 'type' => 'select',
- 'required' => true,
- 'preferences' => {},
- 'options' => [
- { 'value' => 'Male', 'uuid' => SecureRandom.uuid },
- { 'value' => 'Female', 'uuid' => SecureRandom.uuid }
- ],
- 'areas' => [
- {
- 'x' => 0.4513888888888889,
- 'y' => 0.1752954719877206,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Initials',
- 'type' => 'initials',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.4486111111111111,
- 'y' => 0.2273599386032233,
- 'w' => 0.1,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Avatar',
- 'type' => 'image',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.7180555555555556,
- 'y' => 0.1129547198772064,
- 'w' => 0.2,
- 'h' => 0.1414538310412574,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Attachment',
- 'type' => 'file',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.7166666666666667,
- 'y' => 0.3020107444359171,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Stamp',
- 'type' => 'stamp',
- 'required' => true,
- 'readonly' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.7166666666666667,
- 'y' => 0.3771910974673829,
- 'w' => 0.2,
- 'h' => 0.0707269155206287,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Cell code',
- 'type' => 'cells',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.4472222222222222,
- 'y' => 0.3530851880276286,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'cell_w' => 0.04,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Payment',
- 'type' => 'payment',
- 'required' => true,
- 'preferences' => { 'currency' => 'EUR', 'price' => 1000 },
- 'areas' => [
- {
- 'x' => 0.4486111111111111,
- 'y' => 0.43168073676132,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- },
- {
- 'uuid' => SecureRandom.uuid,
- 'submitter_uuid' => submitter['uuid'],
- 'name' => 'Mobile Phone',
- 'type' => 'phone',
- 'required' => true,
- 'preferences' => {},
- 'areas' => [
- {
- 'x' => 0.44443359375,
- 'y' => 0.3010283960092095,
- 'w' => 0.2,
- 'h' => 0.02857142857142857,
- 'attachment_uuid' => attachment.uuid,
- 'page' => 0
- }
- ]
- }
- ].select { |f| ev.only_field_types.include?(f['type']) && ev.except_field_types.exclude?(f['type']) }
+ ev.attachment_count.times do |i|
+ attachment_index = i + 1 if i > 0
+ field_index = "(#{attachment_index})" if attachment_index
- fields
+ blob = ActiveStorage::Blob.create_and_upload!(
+ io: Rails.root.join('spec/fixtures/sample-document.pdf').open,
+ filename: 'sample-document.pdf',
+ content_type: 'application/pdf'
+ )
+ attachment = ActiveStorage::Attachment.create!(
+ blob:,
+ name: :documents,
+ record: template
+ )
+
+ Templates::ProcessDocument.call(attachment, attachment.download)
+
+ template.schema << {
+ attachment_uuid: attachment.uuid,
+ name: ['sample-document', attachment_index].compact.join('-')
+ }
+
+ template.fields += template.submitters.reduce([]) do |fields, submitter|
+ fields += [
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['First Name', field_index].compact.join(' '),
+ 'type' => 'text',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.09273546006944444,
+ 'y' => 0.1099851117387033,
+ 'w' => 0.2701497395833333,
+ 'h' => 0.0372705365913556,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Birthday', field_index].compact.join(' '),
+ 'type' => 'date',
+ 'required' => true,
+ 'preferences' => { 'format' => 'DD/MM/YYYY' },
+ 'areas' => [
+ {
+ 'x' => 0.09166666666666666,
+ 'y' => 0.1762778204144282,
+ 'w' => 0.2763888888888889,
+ 'h' => 0.0359029261474578,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Do you agree?', field_index].compact.join(' '),
+ 'type' => 'checkbox',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.09051106770833334,
+ 'y' => 0.227587027259332,
+ 'w' => 0.2784450954861111,
+ 'h' => 0.04113074042239687,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['First child', field_index].compact.join(' '),
+ 'type' => 'radio',
+ 'required' => true,
+ 'preferences' => {},
+ 'options' => [
+ { 'value' => 'Girl', 'uuid' => SecureRandom.uuid },
+ { 'value' => 'Boy', 'uuid' => SecureRandom.uuid }
+ ],
+ 'areas' => [
+ {
+ 'x' => 0.09027777777777778,
+ 'y' => 0.3020184190330008,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Signature', field_index].compact.join(' '),
+ 'type' => 'signature',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.08611111111111111,
+ 'y' => 0.3487183422870299,
+ 'w' => 0.2,
+ 'h' => 0.0707269155206287,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['House number', field_index].compact.join(' '),
+ 'type' => 'number',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.08333333333333333,
+ 'y' => 0.4582041442824252,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Colors', field_index].compact.join(' '),
+ 'type' => 'multiple',
+ 'required' => true,
+ 'preferences' => {},
+ 'options' => [
+ { 'value' => 'Red', 'uuid' => SecureRandom.uuid },
+ { 'value' => 'Green', 'uuid' => SecureRandom.uuid },
+ { 'value' => 'Blue', 'uuid' => SecureRandom.uuid }
+ ],
+ 'areas' => [
+ {
+ 'x' => 0.45,
+ 'y' => 0.1133998465080583,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Gender', field_index].compact.join(' '),
+ 'type' => 'select',
+ 'required' => true,
+ 'preferences' => {},
+ 'options' => [
+ { 'value' => 'Male', 'uuid' => SecureRandom.uuid },
+ { 'value' => 'Female', 'uuid' => SecureRandom.uuid }
+ ],
+ 'areas' => [
+ {
+ 'x' => 0.4513888888888889,
+ 'y' => 0.1752954719877206,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Initials', field_index].compact.join(' '),
+ 'type' => 'initials',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.4486111111111111,
+ 'y' => 0.2273599386032233,
+ 'w' => 0.1,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Avatar', field_index].compact.join(' '),
+ 'type' => 'image',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.7180555555555556,
+ 'y' => 0.1129547198772064,
+ 'w' => 0.2,
+ 'h' => 0.1414538310412574,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Attachment', field_index].compact.join(' '),
+ 'type' => 'file',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.7166666666666667,
+ 'y' => 0.3020107444359171,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Stamp', field_index].compact.join(' '),
+ 'type' => 'stamp',
+ 'required' => true,
+ 'readonly' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.7166666666666667,
+ 'y' => 0.3771910974673829,
+ 'w' => 0.2,
+ 'h' => 0.0707269155206287,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Cell code', field_index].compact.join(' '),
+ 'type' => 'cells',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.4472222222222222,
+ 'y' => 0.3530851880276286,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'cell_w' => 0.04,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Payment', field_index].compact.join(' '),
+ 'type' => 'payment',
+ 'required' => true,
+ 'preferences' => { 'currency' => 'EUR', 'price' => 1000 },
+ 'areas' => [
+ {
+ 'x' => 0.4486111111111111,
+ 'y' => 0.43168073676132,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ },
+ {
+ 'uuid' => SecureRandom.uuid,
+ 'submitter_uuid' => submitter['uuid'],
+ 'name' => ['Mobile Phone', field_index].compact.join(' '),
+ 'type' => 'phone',
+ 'required' => true,
+ 'preferences' => {},
+ 'areas' => [
+ {
+ 'x' => 0.44443359375,
+ 'y' => 0.3010283960092095,
+ 'w' => 0.2,
+ 'h' => 0.02857142857142857,
+ 'attachment_uuid' => attachment.uuid,
+ 'page' => 0
+ }
+ ]
+ }
+ ].select { |f| ev.only_field_types.include?(f['type']) && ev.except_field_types.exclude?(f['type']) }
+
+ fields
+ end
end
template.save!