submission completed_at

pull/698/merge
Pete Matsyburka 1 month ago
parent 6314987e69
commit 1902cdaa55

@ -92,10 +92,16 @@ module Api
Submissions.send_signature_requests(submissions) Submissions.send_signature_requests(submissions)
submissions.each do |submission| submissions.each do |submission|
if submission.submitters.all?(&:completed_at?) && Submissions.maybe_update_completed_at(submission)
last_submitter = submission.submitters.max_by(&:completed_at)
end
submission.submitters.each do |submitter| submission.submitters.each do |submitter|
next unless submitter.completed_at? next unless submitter.completed_at?
ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id, 'send_invitation_email' => false) ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id,
'is_last' => submitter == last_submitter,
'send_invitation_email' => false)
end end
end end

@ -73,7 +73,9 @@ module Api
end end
if @submitter.completed_at? if @submitter.completed_at?
ProcessSubmitterCompletionJob.perform_async('submitter_id' => @submitter.id) is_last = Submissions.maybe_update_completed_at(@submitter.submission)
ProcessSubmitterCompletionJob.perform_async('submitter_id' => @submitter.id, 'is_last' => is_last)
elsif normalized_params[:send_email] || normalized_params[:send_sms] elsif normalized_params[:send_email] || normalized_params[:send_sms]
Submitters.send_signature_requests([@submitter]) Submitters.send_signature_requests([@submitter])
end end

@ -5,30 +5,37 @@ class ProcessSubmitterCompletionJob
def perform(params = {}) def perform(params = {})
submitter = Submitter.find(params['submitter_id']) submitter = Submitter.find(params['submitter_id'])
submission = submitter.submission
create_completed_submitter!(submitter) create_completed_submitter!(submitter)
is_all_completed = !submitter.submission.submitters.exists?(completed_at: nil) is_last =
if params.key?('is_last')
params['is_last']
else
!submission.submitters.exists?(completed_at: nil) &&
submitter.completed_at == submission.submitters.maximum(:completed_at)
end
Submissions::EnsureResultGenerated.call(submitter) Submissions::EnsureResultGenerated.call(submitter)
if is_all_completed && submitter.completed_at == submitter.submission.submitters.maximum(:completed_at) if is_last
if submitter.submission.account.account_configs.exists?(key: AccountConfig::COMBINE_PDF_RESULT_KEY, value: true) if submission.account.account_configs.exists?(key: AccountConfig::COMBINE_PDF_RESULT_KEY, value: true)
Submissions::EnsureCombinedGenerated.call(submitter) Submissions::EnsureCombinedGenerated.call(submitter)
end end
Submissions::EnsureAuditGenerated.call(submitter.submission) Submissions::EnsureAuditGenerated.call(submission)
enqueue_completed_emails(submitter) enqueue_completed_emails(submitter)
end end
create_completed_documents!(submitter) create_completed_documents!(submitter)
if !is_all_completed && submitter.submission.submitters_order_preserved? && params['send_invitation_email'] != false if !submission.completed_at && submission.submitters_order_preserved? && params['send_invitation_email'] != false
enqueue_next_submitter_request_notification(submitter) enqueue_next_submitter_request_notification(submitter)
end end
enqueue_completed_webhooks(submitter, is_all_completed:) enqueue_completed_webhooks(submitter, is_last:)
end end
def create_completed_submitter!(submitter) def create_completed_submitter!(submitter)
@ -77,7 +84,7 @@ class ProcessSubmitterCompletionJob
end end
end end
def enqueue_completed_webhooks(submitter, is_all_completed: false) def enqueue_completed_webhooks(submitter, is_last: false)
event_uuids = {} event_uuids = {}
WebhookUrls.for_account_id(submitter.account_id, %w[form.completed submission.completed]).each do |webhook| WebhookUrls.for_account_id(submitter.account_id, %w[form.completed submission.completed]).each do |webhook|
@ -89,7 +96,7 @@ class ProcessSubmitterCompletionJob
'webhook_url_id' => webhook.id) 'webhook_url_id' => webhook.id)
end end
next unless webhook.events.include?('submission.completed') && is_all_completed next unless webhook.events.include?('submission.completed') && is_last
event_uuids['submission.completed'] ||= SecureRandom.uuid event_uuids['submission.completed'] ||= SecureRandom.uuid

@ -6,6 +6,7 @@
# #
# id :bigint not null, primary key # id :bigint not null, primary key
# archived_at :datetime # archived_at :datetime
# completed_at :datetime
# expire_at :datetime # expire_at :datetime
# name :text # name :text
# preferences :text not null # preferences :text not null

@ -0,0 +1,7 @@
# frozen_string_literal: true
class AddSubmissionCompletedAt < ActiveRecord::Migration[8.1]
def change
add_column :submissions, :completed_at, :datetime
end
end

@ -10,7 +10,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.1].define(version: 2026_06_28_120000) do ActiveRecord::Schema[8.1].define(version: 2026_07_01_123007) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "btree_gin" enable_extension "btree_gin"
enable_extension "pg_catalog.plpgsql" enable_extension "pg_catalog.plpgsql"
@ -358,6 +358,7 @@ ActiveRecord::Schema[8.1].define(version: 2026_06_28_120000) do
create_table "submissions", force: :cascade do |t| create_table "submissions", force: :cascade do |t|
t.bigint "account_id", null: false t.bigint "account_id", null: false
t.datetime "archived_at" t.datetime "archived_at"
t.datetime "completed_at"
t.datetime "created_at", null: false t.datetime "created_at", null: false
t.bigint "created_by_user_id" t.bigint "created_by_user_id"
t.datetime "expire_at" t.datetime "expire_at"

@ -116,15 +116,6 @@ module Mcp
Submissions.send_signature_requests(submissions) Submissions.send_signature_requests(submissions)
submissions.each do |submission|
submission.submitters.each do |submitter|
next unless submitter.completed_at?
ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id,
'send_invitation_email' => false)
end
end
SearchEntries.enqueue_reindex(submissions) SearchEntries.enqueue_reindex(submissions)
submission = submissions.first submission = submissions.first

@ -5,6 +5,22 @@ module Submissions
module_function module_function
def maybe_update_completed_at(submission)
incomplete_submitter = Submitter.where(submission_id: submission.id, completed_at: nil).select(1)
max_completed_at =
Arel::Nodes::Grouping.new(
Submitter.arel_table.project(Submitter.arel_table[:completed_at].maximum)
.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id]))
.ast
)
Submission.where(id: submission.id, completed_at: nil)
.where.not(incomplete_submitter.arel.exists)
.update_all(completed_at: max_completed_at)
.positive?
end
def search(current_user, submissions, keyword, search_values: false, search_template: false) def search(current_user, submissions, keyword, search_values: false, search_template: false)
if Docuseal.fulltext_search? if Docuseal.fulltext_search?
fulltext_search(current_user, submissions, keyword, search_template:) fulltext_search(current_user, submissions, keyword, search_template:)

@ -32,7 +32,11 @@ module Submitters
submitter.submission.save! submitter.submission.save!
ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id) if submitter.completed_at? if submitter.completed_at?
is_last = Submissions.maybe_update_completed_at(submitter.submission)
ProcessSubmitterCompletionJob.perform_async('submitter_id' => submitter.id, 'is_last' => is_last)
end
submitter submitter
end end

Loading…
Cancel
Save