mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
361 lines
12 KiB
361 lines
12 KiB
# frozen_string_literal: true
|
|
|
|
FactoryBot.define do
|
|
factory :template do
|
|
account
|
|
|
|
author factory: %i[user]
|
|
name { Faker::Book.title }
|
|
|
|
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
|
|
except_field_types { [] }
|
|
private_access_user { nil }
|
|
end
|
|
|
|
after(:create) do |template, ev|
|
|
number_words = %w[first second third fourth fifth sixth seventh eighth ninth tenth]
|
|
|
|
template.submitters = Array.new(ev.submitter_count) do |i|
|
|
{
|
|
'name' => "#{number_words[i]&.capitalize} Party",
|
|
'uuid' => SecureRandom.uuid
|
|
}
|
|
end
|
|
|
|
ev.attachment_count.times do |i|
|
|
attachment_index = i + 1 if i > 0
|
|
field_index = "(#{attachment_index})" if attachment_index
|
|
|
|
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!
|
|
end
|
|
|
|
trait :with_admin_only_access do
|
|
after(:create) do |template|
|
|
create(:template_access, template:, user_id: TemplateAccess::ADMIN_USER_ID)
|
|
end
|
|
end
|
|
|
|
trait :with_private_access do
|
|
after(:create) do |template, ev|
|
|
create(:template_access, template:, user: ev.private_access_user || template.author)
|
|
end
|
|
end
|
|
end
|
|
end
|