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.
144 lines
4.7 KiB
144 lines
4.7 KiB
# frozen_string_literal: true
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: submissions
|
|
#
|
|
# id :bigint not null, primary key
|
|
# archived_at :datetime
|
|
# expire_at :datetime
|
|
# name :text
|
|
# preferences :text not null
|
|
# slug :string not null
|
|
# source :string not null
|
|
# submitters_order :string not null
|
|
# template_fields :text
|
|
# template_schema :text
|
|
# template_submitters :text
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# account_id :integer not null
|
|
# created_by_user_id :integer
|
|
# template_id :integer
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_submissions_on_account_id_and_id (account_id,id)
|
|
# index_submissions_on_account_id_and_template_id_and_id (account_id,template_id,id) WHERE (archived_at IS NULL)
|
|
# index_submissions_on_account_id_and_template_id_and_id_archived (account_id,template_id,id) WHERE (archived_at IS NOT NULL)
|
|
# index_submissions_on_created_by_user_id (created_by_user_id)
|
|
# index_submissions_on_slug (slug) UNIQUE
|
|
# index_submissions_on_template_id (template_id)
|
|
#
|
|
# Foreign Keys
|
|
#
|
|
# fk_rails_... (created_by_user_id => users.id)
|
|
# fk_rails_... (template_id => templates.id)
|
|
#
|
|
class Submission < ApplicationRecord
|
|
belongs_to :template, optional: true
|
|
belongs_to :account
|
|
belongs_to :created_by_user, class_name: 'User', optional: true
|
|
|
|
has_one :search_entry, as: :record, inverse_of: :record, dependent: :destroy
|
|
|
|
has_many :submitters, dependent: :destroy
|
|
has_many :submission_events, dependent: :destroy
|
|
|
|
attribute :preferences, :string, default: -> { {} }
|
|
|
|
serialize :template_fields, coder: JSON
|
|
serialize :template_schema, coder: JSON
|
|
serialize :template_submitters, coder: JSON
|
|
serialize :preferences, coder: JSON
|
|
|
|
attribute :source, :string, default: 'link'
|
|
attribute :submitters_order, :string, default: 'single_sided'
|
|
|
|
attribute :slug, :string, default: -> { SecureRandom.base58(14) }
|
|
|
|
has_one_attached :audit_trail
|
|
has_one_attached :combined_document
|
|
|
|
has_many_attached :preview_documents
|
|
has_many_attached :documents
|
|
|
|
has_many :template_accesses, primary_key: :template_id, foreign_key: :template_id, dependent: nil, inverse_of: false
|
|
|
|
has_many :template_schema_documents,
|
|
->(e) { where(uuid: (e.template_schema.presence || e.template.schema).pluck('attachment_uuid')) },
|
|
through: :template, source: :documents_attachments
|
|
|
|
scope :active, -> { where(archived_at: nil) }
|
|
scope :archived, -> { where.not(archived_at: nil) }
|
|
scope :pending, lambda {
|
|
where(Submitter.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id])
|
|
.and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists)
|
|
}
|
|
scope :completed, lambda {
|
|
where.not(Submitter.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id])
|
|
.and(Submitter.arel_table[:completed_at].eq(nil))).select(1).arel.exists)
|
|
}
|
|
scope :declined, lambda {
|
|
where(Submitter.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id])
|
|
.and(Submitter.arel_table[:declined_at].not_eq(nil))).select(1).arel.exists)
|
|
}
|
|
scope :expired, -> { pending.where(expire_at: ..Time.current) }
|
|
|
|
enum :source, {
|
|
invite: 'invite',
|
|
bulk: 'bulk',
|
|
api: 'api',
|
|
embed: 'embed',
|
|
link: 'link'
|
|
}, scope: false, prefix: true
|
|
|
|
enum :submitters_order, {
|
|
single_sided: 'single_sided',
|
|
employee_then_manager: 'employee_then_manager',
|
|
manager_then_employee: 'manager_then_employee',
|
|
simultaneous: 'simultaneous'
|
|
}, scope: false, prefix: true
|
|
|
|
def signing_order_enforced?
|
|
template_signing_order.in?(%w[employee_then_manager manager_then_employee])
|
|
end
|
|
|
|
def expired?
|
|
expire_at && expire_at <= Time.current
|
|
end
|
|
|
|
def last_completed_submitter
|
|
submitters.where.not(completed_at: nil).order(:completed_at).last
|
|
end
|
|
|
|
def template_signing_order
|
|
template&.preferences&.dig('submitters_order')
|
|
end
|
|
|
|
def schema_documents
|
|
if template_id?
|
|
template_schema_documents
|
|
else
|
|
documents_attachments
|
|
end
|
|
end
|
|
|
|
def fields_uuid_index
|
|
@fields_uuid_index ||= (template_fields || template.fields).index_by { |f| f['uuid'] }
|
|
end
|
|
|
|
def audit_trail_url
|
|
return if audit_trail.blank?
|
|
|
|
ActiveStorage::Blob.proxy_url(audit_trail.blob)
|
|
end
|
|
alias audit_log_url audit_trail_url
|
|
|
|
def combined_document_url
|
|
return if combined_document.blank?
|
|
|
|
ActiveStorage::Blob.proxy_url(combined_document.blob)
|
|
end
|
|
end
|