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.
		
		
		
		
		
			
		
			
				
					
					
						
							105 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
	
	
							105 lines
						
					
					
						
							3.2 KiB
						
					
					
				# frozen_string_literal: true
 | 
						|
 | 
						|
# == Schema Information
 | 
						|
#
 | 
						|
# Table name: submissions
 | 
						|
#
 | 
						|
#  id                  :bigint           not null, primary key
 | 
						|
#  archived_at         :datetime
 | 
						|
#  expire_at           :datetime
 | 
						|
#  preferences         :text             not null
 | 
						|
#  slug                :string           not null
 | 
						|
#  source              :text             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          :bigint           not null
 | 
						|
#  created_by_user_id  :bigint
 | 
						|
#  template_id         :bigint           not null
 | 
						|
#
 | 
						|
# Indexes
 | 
						|
#
 | 
						|
#  index_submissions_on_account_id_and_id   (account_id,id)
 | 
						|
#  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
 | 
						|
  belongs_to :account
 | 
						|
  belongs_to :created_by_user, class_name: 'User', optional: true
 | 
						|
 | 
						|
  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: 'random'
 | 
						|
 | 
						|
  attribute :slug, :string, default: -> { SecureRandom.base58(14) }
 | 
						|
 | 
						|
  has_one_attached :audit_trail
 | 
						|
  has_one_attached :combined_document
 | 
						|
 | 
						|
  has_many_attached :preview_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 :pending, -> { joins(:submitters).where(submitters: { completed_at: nil }).group(:id) }
 | 
						|
  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, -> { joins(:submitters).where.not(submitters: { declined_at: nil }).group(:id) }
 | 
						|
  scope :expired, -> { where(expire_at: ..Time.current) }
 | 
						|
 | 
						|
  enum :source, {
 | 
						|
    invite: 'invite',
 | 
						|
    bulk: 'bulk',
 | 
						|
    api: 'api',
 | 
						|
    embed: 'embed',
 | 
						|
    link: 'link'
 | 
						|
  }, scope: false, prefix: true
 | 
						|
 | 
						|
  enum :submitters_order, {
 | 
						|
    random: 'random',
 | 
						|
    preserved: 'preserved'
 | 
						|
  }, scope: false, prefix: true
 | 
						|
 | 
						|
  def expired?
 | 
						|
    expire_at && expire_at <= Time.current
 | 
						|
  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
 |