From 28168f082d068c907d035b55a316c62cc85c0b3c Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Thu, 9 Jul 2026 11:40:55 +0300 Subject: [PATCH] adjust view only --- app/controllers/api/submitters_controller.rb | 2 +- .../send_submission_email_controller.rb | 14 +++++++------ app/controllers/start_form_controller.rb | 5 +++-- ...bmit_form_completed_download_controller.rb | 8 ++----- app/controllers/submit_form_controller.rb | 5 ++++- .../submit_form_download_controller.rb | 1 + .../submit_form_metadata_controller.rb | 21 ++++++++++++------- app/controllers/submitters_controller.rb | 2 +- app/mailers/submitter_mailer.rb | 14 ++++++++----- app/models/submission.rb | 5 ++--- app/views/submit_form/completed.html.erb | 5 +++-- app/views/templates/_submission.html.erb | 4 ++-- lib/submissions/ensure_combined_generated.rb | 3 ++- lib/submitters.rb | 14 +++++++------ 14 files changed, 60 insertions(+), 43 deletions(-) diff --git a/app/controllers/api/submitters_controller.rb b/app/controllers/api/submitters_controller.rb index ec15ab11..555dc92d 100644 --- a/app/controllers/api/submitters_controller.rb +++ b/app/controllers/api/submitters_controller.rb @@ -101,7 +101,7 @@ module Api private def maybe_return_submitter_error - if @submitter.completed_at? + if @submitter.completed_at? || @submitter.submission.completed_at? return render json: { error: 'Submitter has already completed the submission.' }, status: :unprocessable_content end diff --git a/app/controllers/send_submission_email_controller.rb b/app/controllers/send_submission_email_controller.rb index 41f06bf7..13bd5f16 100644 --- a/app/controllers/send_submission_email_controller.rb +++ b/app/controllers/send_submission_email_controller.rb @@ -16,18 +16,16 @@ class SendSubmissionEmailController < ApplicationController @submitter = Submitter.completed.where(submission: template.submissions).find_by(email: params[:email].to_s.downcase) elsif params[:submission_slug] - submission = Submission.find_by(slug: params[:submission_slug]) + submission = Submission.find_by!(slug: params[:submission_slug]) - if submission - @submitter = Submitter.completed.find_by(submission: submission, email: params[:email].to_s.downcase) - end + @submitter = submission.submitters.order(:completed_at).find_by(email: params[:email].to_s.downcase) return redirect_to submissions_preview_completed_path(params[:submission_slug], status: :error) unless @submitter else - @submitter = Submitter.completed.find_by!(slug: params[:submitter_slug]) + @submitter = Submitter.find_by!(slug: params[:submitter_slug]) end - if @submitter + if @submitter && completed_submitter?(@submitter) RateLimit.call("send-email-#{@submitter.id}", limit: 2, ttl: 5.minutes) SubmitterMailer.documents_copy_email(@submitter, sig: true).deliver_later! if can_send?(@submitter) @@ -41,6 +39,10 @@ class SendSubmissionEmailController < ApplicationController private + def completed_submitter?(submitter) + submitter.completed_at? || (submitter.viewer? && submitter.submission.completed_at?) + end + def can_send?(submitter) return false if submitter.account.archived_at? return false if EmailEvent.exists?(tag: :submitter_documents_copy, email: submitter.email, emailable: submitter, diff --git a/app/controllers/start_form_controller.rb b/app/controllers/start_form_controller.rb index 5d3614f2..accf6798 100644 --- a/app/controllers/start_form_controller.rb +++ b/app/controllers/start_form_controller.rb @@ -141,8 +141,7 @@ class StartFormController < ApplicationController submitter ||= Submitter - .where(submission: template.submissions.where(expire_at: Time.current..) - .or(template.submissions.where(expire_at: nil)).where(archived_at: nil)) + .where(submission: template.submissions.non_expired.active) .order(id: :desc) .where(declined_at: nil) .where(external_id: nil) @@ -150,6 +149,8 @@ class StartFormController < ApplicationController .then { |rel| params[:resubmit].present? || params[:selfsign].present? ? rel.where(completed_at: nil) : rel } .find_or_initialize_by(find_params) + submitter = Submitter.new(find_params) if submitter.submission&.completed_at? && submitter.viewer? + submitter.name = required_params['name'] if submitter.new_record? unless @resubmit_submitter diff --git a/app/controllers/submit_form_completed_download_controller.rb b/app/controllers/submit_form_completed_download_controller.rb index 19dfafb1..6f959d0d 100644 --- a/app/controllers/submit_form_completed_download_controller.rb +++ b/app/controllers/submit_form_completed_download_controller.rb @@ -19,7 +19,7 @@ class SubmitFormCompletedDownloadController < ApplicationController @submitter ||= Submitter.find_by!(slug: submitter_slug) - Submissions::EnsureResultGenerated.call(@submitter) + Submissions::EnsureResultGenerated.call(@submitter) if @submitter.completed_at? last_submitter = @submitter.submission.submitters.where.not(completed_at: nil).order(:completed_at).last @@ -28,11 +28,7 @@ class SubmitFormCompletedDownloadController < ApplicationController Submissions::EnsureResultGenerated.call(last_submitter) if !signature_valid && !current_user_submitter?(last_submitter) - unless Submitters::AuthorizedForForm.call(@submitter, current_user, request) - Rollbar.info("2FA download error: #{last_submitter.id}") if defined?(Rollbar) - - return head :not_found - end + return head :not_found unless Submitters::AuthorizedForForm.call(@submitter, current_user, request) if last_submitter.completed_at < TTL.ago Rollbar.info("TTL: #{last_submitter.id}") if defined?(Rollbar) diff --git a/app/controllers/submit_form_controller.rb b/app/controllers/submit_form_controller.rb index 1f689ece..43db9514 100644 --- a/app/controllers/submit_form_controller.rb +++ b/app/controllers/submit_form_controller.rb @@ -18,7 +18,10 @@ class SubmitFormController < ApplicationController submission = @submitter.submission return render :email_2fa unless Submitters::AuthorizedForForm.pass_email_2fa?(@submitter, request) - return redirect_to submit_form_completed_path(@submitter.slug) if @submitter.completed_at? + + if @submitter.completed_at? || submission.completed_at? + return redirect_to submit_form_completed_path(@submitter.slug) + end @form_configs = Submitters::FormConfigs.call(@submitter, CONFIG_KEYS) diff --git a/app/controllers/submit_form_download_controller.rb b/app/controllers/submit_form_download_controller.rb index e1c22eba..821267b2 100644 --- a/app/controllers/submit_form_download_controller.rb +++ b/app/controllers/submit_form_download_controller.rb @@ -14,6 +14,7 @@ class SubmitFormDownloadController < ApplicationController return head :unprocessable_content if @submitter.declined_at? || @submitter.submission.archived_at? || @submitter.submission.expired? || + @submitter.submission.completed_at? || @submitter.submission.template&.archived_at? || AccountConfig.exists?(account_id: @submitter.account_id, key: AccountConfig::ALLOW_TO_PARTIAL_DOWNLOAD_KEY, diff --git a/app/controllers/submit_form_metadata_controller.rb b/app/controllers/submit_form_metadata_controller.rb index dcdeaa20..62a73d9f 100644 --- a/app/controllers/submit_form_metadata_controller.rb +++ b/app/controllers/submit_form_metadata_controller.rb @@ -7,13 +7,7 @@ class SubmitFormMetadataController < ApplicationController def index @submitter = Submitter.find_by!(slug: params[:submit_form_slug]) - return head :not_found if @submitter.declined_at? || - @submitter.completed_at? || - @submitter.submission.archived_at? || - @submitter.submission.expired? || - @submitter.submission.template&.archived_at? || - @submitter.account.archived_at? || - !Submitters::AuthorizedForForm.call(@submitter, current_user, request) + return head :not_found unless authorized_submitter?(@submitter) submission = @submitter.submission values = submission.submitters.reduce({}) { |acc, sub| acc.merge(sub.values) } @@ -34,4 +28,17 @@ class SubmitFormMetadataController < ApplicationController render json: { text_runs: } end + + private + + def authorized_submitter?(submitter) + !submitter.declined_at? && + !submitter.completed_at? && + !submitter.submission.archived_at? && + !submitter.submission.completed_at? && + !submitter.submission.expired? && + !submitter.submission.template&.archived_at? && + !submitter.account.archived_at? && + Submitters::AuthorizedForForm.call(submitter, current_user, request) + end end diff --git a/app/controllers/submitters_controller.rb b/app/controllers/submitters_controller.rb index 18e749f3..7a40101f 100644 --- a/app/controllers/submitters_controller.rb +++ b/app/controllers/submitters_controller.rb @@ -50,7 +50,7 @@ class SubmittersController < ApplicationController def submitter_editable?(submission) !@submitter.submission_events.exists?(event_type: 'start_form') && - !@submitter.completed_at? && !@submitter.declined_at? && + !@submitter.completed_at? && !@submitter.declined_at? && !submission.completed_at? && !submission.archived_at? && !submission.expired? && !submission.template&.archived_at? end diff --git a/app/mailers/submitter_mailer.rb b/app/mailers/submitter_mailer.rb index 9713d1ac..3a8c191b 100644 --- a/app/mailers/submitter_mailer.rb +++ b/app/mailers/submitter_mailer.rb @@ -92,8 +92,6 @@ class SubmitterMailer < ApplicationMailer template_preferences = @submission.template&.preferences || {} - Submissions::EnsureResultGenerated.call(submitter) - @email_config = AccountConfigs.find_for_account(@current_account, AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY) add_completed_email_attachments!( @@ -148,8 +146,6 @@ class SubmitterMailer < ApplicationMailer template_preferences = @submitter.template&.preferences || {} - Submissions::EnsureResultGenerated.call(@submitter) - @email_config = AccountConfigs.find_for_account(@current_account, AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY) add_completed_email_attachments!( @@ -211,7 +207,7 @@ class SubmitterMailer < ApplicationMailer end def add_completed_email_attachments!(submitter, with_audit_log: true, with_documents: true) - documents = with_documents ? Submitters.select_attachments_for_download(submitter) : [] + documents = with_documents ? select_completed_documents(submitter) : [] filename_format = AccountConfig.find_or_initialize_by(account_id: submitter.account_id, key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY)&.value @@ -268,6 +264,14 @@ class SubmitterMailer < ApplicationMailer submitter.template&.preferences&.dig('submitters').to_a.index_by { |e| e['uuid'] } end + def select_completed_documents(submitter) + last_submitter = Submitter.where(submission_id: submitter.submission_id).completed.order(:completed_at).last + + Submissions::EnsureResultGenerated.call(last_submitter) + + Submitters.select_attachments_for_download(last_submitter) + end + def add_attachments_with_size_limit(submitter, storage_attachments, current_size, filename_format = nil) total_size = current_size diff --git a/app/models/submission.rb b/app/models/submission.rb index f6e19683..d65018c0 100644 --- a/app/models/submission.rb +++ b/app/models/submission.rb @@ -92,9 +92,8 @@ class Submission < ApplicationRecord scope :active, -> { where(archived_at: nil) } scope :archived, -> { where.not(archived_at: nil) } - scope :pending, lambda { - where(expire_at: nil).or(where(expire_at: Time.current..)).where(completed_at: nil) - } + scope :non_expired, -> { where(expire_at: nil).or(where(expire_at: Time.current..)) } + scope :pending, -> { non_expired.where(completed_at: nil) } scope :completed, -> { where.not(completed_at: nil) } scope :declined, lambda { where(Submitter.where(Submitter.arel_table[:submission_id].eq(Submission.arel_table[:id])) diff --git a/app/views/submit_form/completed.html.erb b/app/views/submit_form/completed.html.erb index adc54428..d006187e 100644 --- a/app/views/submit_form/completed.html.erb +++ b/app/views/submit_form/completed.html.erb @@ -1,3 +1,4 @@ +<% completed_at = @submitter.completed_at || @submitter.submission.completed_at %>
@@ -12,7 +13,7 @@

<%= @submitter.submission.name || @submitter.submission.template&.name %>

- <%= t(@submitter.with_signature_fields? ? 'signed_on_time' : 'completed_on_time', time: l(@submitter.completed_at.to_date, format: :long)) %> + <%= t(@submitter.with_signature_fields? ? 'signed_on_time' : 'completed_on_time', time: l(completed_at.to_date, format: :long)) %>

@@ -29,7 +30,7 @@
<% end %> <% end %> - <% if @submitter.completed_at > 30.minutes.ago || (current_user && current_user.account.submitters.exists?(id: @submitter.id)) %> + <% if completed_at > 30.minutes.ago || (current_user && current_user.account.submitters.exists?(id: @submitter.id)) %> <%= svg_icon('download', class: 'w-6 h-6') %> diff --git a/app/views/templates/_submission.html.erb b/app/views/templates/_submission.html.erb index 813a36d8..73fe8e75 100644 --- a/app/views/templates/_submission.html.erb +++ b/app/views/templates/_submission.html.erb @@ -51,7 +51,7 @@ <%= submitter.name || submitter.email || submitter.phone %> - <% if !submitter.completed_at? && can?(:update, submission) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %> + <% if !submitter.completed_at? && !submission.completed_at? && can?(:update, submission) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %> <%= link_to edit_submitter_path(submitter), class: 'shrink-0', data: { turbo_frame: 'modal' } do %> <%= svg_icon('pencil', class: 'w-5 h-5') %> @@ -144,7 +144,7 @@ <%= submitter.name || submitter.email || submitter.phone %> - <% if !submitter.completed_at? && can?(:update, submission) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %> + <% if !submitter.completed_at? && !submission.completed_at? && can?(:update, submission) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %> <%= link_to edit_submitter_path(submitter), class: 'shrink-0', data: { turbo_frame: 'modal' } do %> <%= svg_icon('pencil', class: 'w-5 h-5') %> diff --git a/lib/submissions/ensure_combined_generated.rb b/lib/submissions/ensure_combined_generated.rb index 4b55a4b7..2eeb030b 100644 --- a/lib/submissions/ensure_combined_generated.rb +++ b/lib/submissions/ensure_combined_generated.rb @@ -15,7 +15,8 @@ module Submissions def call(submitter) return nil unless submitter - raise NotCompletedYet unless submitter.completed_at? + raise NotCompletedYet if !submitter.completed_at? || + !submitter.submission.completed_at? total_wait_time ||= 0 key = [KEY_PREFIX, submitter.id].join(':') diff --git a/lib/submitters.rb b/lib/submitters.rb index 75288bf2..7149def2 100644 --- a/lib/submitters.rb +++ b/lib/submitters.rb @@ -105,7 +105,7 @@ module Submitters end def select_attachments_for_download(submitter) - if AccountConfig.exists?(account_id: submitter.submission.account_id, + if AccountConfig.exists?(account_id: submitter.account_id, key: AccountConfig::COMBINE_PDF_RESULT_KEY, value: true) && submitter.submission.completed_at? && @@ -229,10 +229,12 @@ module Submitters end end - filename = filename.gsub( - '{submission.completed_at}', - I18n.l(submitter.completed_at.in_time_zone(submitter.account.timezone), format: :short) - ) + filename = filename.gsub('{submission.completed_at}') do + completed_at = submitter.submission.completed_at || + submitter.submission.submitters.select(&:completed_at).max_by(&:completed_at).completed_at + + I18n.l(completed_at.in_time_zone(submitter.account.timezone), format: :short) + end "#{filename}.#{blob.filename.extension}" end @@ -275,7 +277,7 @@ module Submitters def build_combined_url(submitter, ttl: FILES_TTL) return unless submitter.submission.completed_at? - return if submitter.submission.submitters.order(:completed_at).last != submitter + return if submitter.submission.submitters.completed.order(:completed_at).last != submitter attachment = submitter.submission.combined_document_attachment attachment ||= Submissions::EnsureCombinedGenerated.call(submitter)