diff --git a/app/controllers/evaluation/download_documents_controller.rb b/app/controllers/evaluation/download_documents_controller.rb
index e1db147b8..9c297ca7a 100644
--- a/app/controllers/evaluation/download_documents_controller.rb
+++ b/app/controllers/evaluation/download_documents_controller.rb
@@ -13,18 +13,21 @@ class DownloadDocumentsController < ApplicationController
"EnergyBill",
"Support::EmailTemplateAttachment",
"Support::CaseUploadDocument",
+ "Support::EvaluatorsUploadDocument",
].freeze
def show; end
def update
update_support_details
- send_data @download_document.file.download, type: @download_document.file_type, disposition: "inline", filename: @download_document.file_name
+ send_data @download_document.file.download, type: @download_document.file_type, disposition: "attachment", filename: @download_document.file_name
end
private
helper_method def current_evaluator
- @current_evaluator ||= Support::Evaluator.find_by(support_case_id: params[:id], email: current_user.email)
+ return @current_evaluator if defined? @current_evaluator
+
+ @current_evaluator = Support::Evaluator.where("support_case_id = ? AND LOWER(email) = LOWER(?)", params[:id], current_user.email).first
end
def set_current_case
@current_case = Support::Case.find(params[:id])
@@ -36,7 +39,7 @@ def set_downloaded_documents
end
def check_user_is_evaluator
- return if @current_evaluator.nil? || current_user == @current_evaluator.user
+ return if current_evaluator.present? && current_user.email.downcase == current_evaluator.email.downcase
redirect_to root_path, notice: I18n.t("evaluation.tasks.not_permitted")
end
@@ -45,10 +48,6 @@ def set_documents
@documents = @current_case.upload_documents
end
- def download_document_data
- [@download_document.file.download, { type: @download_document.file_type, disposition: "inline", filename: @download_document.file_name }]
- end
-
def update_support_details
Support::EvaluatorsDownloadDocument.upsert(
{
diff --git a/app/controllers/evaluation/tasks_controller.rb b/app/controllers/evaluation/tasks_controller.rb
index ecc7d6659..84dcd0774 100644
--- a/app/controllers/evaluation/tasks_controller.rb
+++ b/app/controllers/evaluation/tasks_controller.rb
@@ -5,6 +5,7 @@ class TasksController < ApplicationController
before_action :set_uploaded_documents
before_action :set_downloaded_documents
before_action :download_document_status
+ before_action :uploaded_evalaution_files
def edit
session[:email_evaluator_link] = evaluation_task_path(@current_case, host: request.host)
@@ -16,7 +17,7 @@ def show; end
private
helper_method def current_evaluator
- @current_evaluator ||= Support::Evaluator.find_by!(support_case_id: params[:id], email: current_user.email)
+ @current_evaluator ||= Support::Evaluator.find_by(support_case_id: params[:id], email: current_user.email)
end
def set_current_case
@@ -47,5 +48,9 @@ def download_document_status
"to_do"
end
end
+
+ def uploaded_evalaution_files
+ @uploaded_evalaution_files ||= Support::EvaluatorsUploadDocument.where(support_case_id: params[:id], email: current_user.email)
+ end
end
end
diff --git a/app/controllers/evaluation/upload_completed_documents_controller.rb b/app/controllers/evaluation/upload_completed_documents_controller.rb
new file mode 100644
index 000000000..b22bba8ce
--- /dev/null
+++ b/app/controllers/evaluation/upload_completed_documents_controller.rb
@@ -0,0 +1,71 @@
+module Evaluation
+ class UploadCompletedDocumentsController < ApplicationController
+ before_action :set_current_case
+ before_action :check_user_is_evaluator
+ before_action { @back_url = evaluation_task_path(@current_case) }
+ before_action :uploaded_files
+ def show
+ @document_uploader = @current_case.document_uploader
+ end
+
+ def create
+ @document_uploader = @current_case.document_uploader(document_uploader_params)
+ if @document_uploader.valid?
+ @document_uploader.save_evaluation_document!(current_user.email)
+ current_evaluator.update!(case_document_uploader_params)
+ redirect_to @back_url
+ else
+ render :show
+ end
+ end
+
+ def destroy
+ @uploaded_document = Support::EvaluatorsUploadDocument.find(params[:document_id])
+ @support_document = Support::Document.find(@uploaded_document.attachable_id)
+ @back_url = evaluation_upload_completed_document_path(@current_case)
+ return unless params[:confirm]
+
+ @uploaded_document.destroy!
+ @support_document.destroy!
+ if @uploaded_files.empty?
+ reset_uploaded_documents
+ end
+ redirect_to evaluation_upload_completed_document_path(case_id: @current_case.id),
+ notice: I18n.t("support.cases.upload_documents.flash.destroyed", name: @uploaded_document.file_name)
+ end
+
+ private
+
+ helper_method def current_evaluator
+ return @current_evaluator if defined? @current_evaluator
+
+ @current_evaluator = Support::Evaluator.where("support_case_id = ? AND LOWER(email) = LOWER(?)", params[:case_id], current_user.email).first
+ end
+ def set_current_case
+ @current_case = Support::Case.find(params[:case_id])
+ @evaluation_due_date = @current_case.evaluation_due_date? ? @current_case.evaluation_due_date.strftime("%d %B %Y") : nil
+ end
+
+ def document_uploader_params
+ params.fetch(:document_uploader, {}).permit(:edit_form, files: [])
+ end
+
+ def case_document_uploader_params
+ params.require(:document_uploader).permit(:has_uploaded_documents)
+ end
+
+ def check_user_is_evaluator
+ return if current_evaluator.present? && current_user.email.downcase == current_evaluator.email.downcase
+
+ redirect_to root_path, notice: I18n.t("evaluation.tasks.not_permitted")
+ end
+
+ def reset_uploaded_documents
+ current_evaluator.update!(has_uploaded_documents: false)
+ end
+
+ def uploaded_files
+ @uploaded_files ||= Support::EvaluatorsUploadDocument.where(support_case_id: params[:case_id], email: current_user.email)
+ end
+ end
+end
diff --git a/app/controllers/support/cases/document_uploads_controller.rb b/app/controllers/support/cases/document_uploads_controller.rb
index cec33d605..6eb17d11f 100644
--- a/app/controllers/support/cases/document_uploads_controller.rb
+++ b/app/controllers/support/cases/document_uploads_controller.rb
@@ -22,11 +22,15 @@ def create
def destroy
@uploaded_document = Support::CaseUploadDocument.find(params[:document_id])
@support_document = Support::Document.find(@uploaded_document.attachable_id)
+ evaluator_downloaed_document = Support::EvaluatorsDownloadDocument.find_by(support_case_upload_document_id: params[:document_id])
@back_url = edit_support_case_document_uploads_path
return unless params[:confirm]
@uploaded_document.destroy!
@support_document.destroy!
+ if evaluator_downloaed_document
+ evaluator_downloaed_document.destroy!
+ end
if @uploaded_files.empty?
reset_uploaded_documents
@@ -42,7 +46,7 @@ def set_current_case
end
def document_uploader_params
- params.fetch(:document_uploader, {}).permit(:has_uploaded_documents, files: [])
+ params.fetch(:document_uploader, {}).permit(:edit_form, files: [])
end
def case_document_uploader_params
@@ -50,7 +54,7 @@ def case_document_uploader_params
end
def reset_uploaded_documents
- @current_case.update!(has_uploaded_documents: nil)
+ @current_case.update!(has_uploaded_documents: false)
end
end
end
diff --git a/app/controllers/support/document_downloads_controller.rb b/app/controllers/support/document_downloads_controller.rb
index e20d1eb9f..18dcf432b 100644
--- a/app/controllers/support/document_downloads_controller.rb
+++ b/app/controllers/support/document_downloads_controller.rb
@@ -9,6 +9,7 @@ class DocumentDownloadsController < Cases::ApplicationController
"EnergyBill",
"Support::EmailTemplateAttachment",
"Support::CaseUploadDocument",
+ "Support::EvaluatorsUploadDocument",
].freeze
def show
diff --git a/app/models/support/case.rb b/app/models/support/case.rb
index a706a86b6..1cce1a3a0 100644
--- a/app/models/support/case.rb
+++ b/app/models/support/case.rb
@@ -66,6 +66,8 @@ class Case < ApplicationRecord
has_many :upload_documents, class_name: "Support::CaseUploadDocument", foreign_key: :support_case_id
+ has_many :evaluators_upload_documents, class_name: "Support::EvaluatorsUploadDocument", foreign_key: :support_case_id
+
# Support level
#
# L1 - Advice and guidance only
diff --git a/app/models/support/case/document_uploadable.rb b/app/models/support/case/document_uploadable.rb
index 9a21fbfa6..0feb56803 100644
--- a/app/models/support/case/document_uploadable.rb
+++ b/app/models/support/case/document_uploadable.rb
@@ -17,4 +17,18 @@ def upload_document_files(files:)
)
end
end
+
+ def upload_evaluation_document_files(files:, email:)
+ return if files.blank?
+
+ files.each do |file|
+ evaluators_upload_documents.create!(
+ attachable: Support::Document.create!(case: self, file_type: file.content_type, file:),
+ file_type: file.content_type,
+ file_name: file.original_filename,
+ file_size: file.size,
+ email:,
+ )
+ end
+ end
end
diff --git a/app/models/support/case/document_uploader.rb b/app/models/support/case/document_uploader.rb
index 249d7a469..80eff7fda 100644
--- a/app/models/support/case/document_uploader.rb
+++ b/app/models/support/case/document_uploader.rb
@@ -6,16 +6,19 @@ class Support::Case::DocumentUploader
attribute :files
attribute :upload_document_files
attribute :support_case
- attribute :has_uploaded_documents
+ attribute :edit_form
- validates :files, presence: true, if: -> { support_case.has_uploaded_documents.nil? }
+ validates :files, presence: true, if: -> { edit_form == "false" }
validate :files_safe, if: -> { files.present? }
- validates :has_uploaded_documents, presence: true
def save!
support_case.upload_document_files(files:)
end
+ def save_evaluation_document!(email)
+ support_case.upload_evaluation_document_files(files:, email:)
+ end
+
private
def files_safe
diff --git a/app/models/support/evaluators_upload_document.rb b/app/models/support/evaluators_upload_document.rb
new file mode 100644
index 000000000..fc6a659c3
--- /dev/null
+++ b/app/models/support/evaluators_upload_document.rb
@@ -0,0 +1,7 @@
+module Support
+ class EvaluatorsUploadDocument < ApplicationRecord
+ belongs_to :case, class_name: "Support::Case", foreign_key: :support_case_id
+ belongs_to :attachable, polymorphic: true, optional: true
+ delegate :file, :file_type, to: :attachable
+ end
+end
diff --git a/app/views/evaluation/download_documents/show.html.erb b/app/views/evaluation/download_documents/show.html.erb
index 9d18b8a06..e8ea08bf3 100644
--- a/app/views/evaluation/download_documents/show.html.erb
+++ b/app/views/evaluation/download_documents/show.html.erb
@@ -1,7 +1,7 @@
<%= render partial: "support/cases/components/case_header",
locals: { current_case: @current_case } %>
<%= I18n.t("evaluation.download_documents.header") %>
-Use these documents to complete your evaluation of each supplier
+Use these documents to complete your evaluation of each supplier.
If you have a problem or conflict of interest,
<% mail_to_address = "mailto:#{ENV.fetch('MS_GRAPH_SHARED_MAILBOX_ADDRESS')}?subject= Case #{ @current_case.ref} - query" %>
<%= link_to "contact us", mail_to_address , class: "govuk-link" %>
diff --git a/app/views/evaluation/tasks/show.html.erb b/app/views/evaluation/tasks/show.html.erb
index be22d745a..d84492cb7 100644
--- a/app/views/evaluation/tasks/show.html.erb
+++ b/app/views/evaluation/tasks/show.html.erb
@@ -14,10 +14,22 @@
download_status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.to_do"))
end
+ if @download_document_status == 'complete' && current_evaluator.present? && current_evaluator.has_uploaded_documents == true
+ upload_status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.complete"), colour: "green")
+ elsif @download_document_status == 'complete' && ( current_evaluator.present? && current_evaluator.has_uploaded_documents == false && @uploaded_evalaution_files.any? )
+ upload_status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.in_progress"))
+ else
+ upload_status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.to_do"))
+ end
+
task_list.with_item(title: I18n.t("evaluation.task_list.item.download_documents"), href: evaluation_download_document_path(@current_case), status: download_status)
- task_list.with_item(title: I18n.t("evaluation.task_list.item.upload_completed_documents")) do | item |
- item.with_status(text: govuk_tag(text: I18n.t("support.case.label.tasklist.status.cannot_start"), colour: "grey"), cannot_start_yet: true)
+ if @download_document_status == 'complete'
+ task_list.with_item(title: I18n.t("evaluation.task_list.item.upload_completed_documents"), href: evaluation_upload_completed_document_path(@current_case), status: upload_status)
+ else
+ task_list.with_item(title: I18n.t("evaluation.task_list.item.upload_completed_documents")) do | item |
+ item.with_status(text: govuk_tag(text: I18n.t("support.case.label.tasklist.status.cannot_start"), colour: "grey"), cannot_start_yet: true)
+ end
end
task_list.with_item(title: I18n.t("evaluation.task_list.item.evaluation_approved_by_dfe")) do | item |
diff --git a/app/views/evaluation/upload_completed_documents/_form.html.erb b/app/views/evaluation/upload_completed_documents/_form.html.erb
new file mode 100644
index 000000000..cf0ca8552
--- /dev/null
+++ b/app/views/evaluation/upload_completed_documents/_form.html.erb
@@ -0,0 +1,32 @@
+<%= form_with model: @document_uploader, scope: :document_uploader, url: evaluation_upload_completed_documents_path,
+ html: { "data-controller" => "case-files" } do |form| %>
+
<%= I18n.t("support.cases.upload_documents.choose_file_title") %>
+ <%= form.govuk_error_summary %>
+
+ <%= I18n.t("support.cases.upload_documents.button.choose_file") %>
+
+ <%= render "uploaded_documents" %>
+
+
+ <%= form.submit I18n.t("generic.button.continue"), class: "govuk-button", role: "button", "data-action" => "case-files#submit", data: { disable_with: "Uploading..." } %>
+ <%= link_to I18n.t("generic.button.cancel"), @back_url, class: "govuk-link govuk-link--no-visited-state" %>
+
+ <%= hidden_field_tag :case_id, @current_case.id %>
+ <%= form.govuk_file_field :files, multiple: true, include_hidden: false, class: "govuk-!-display-none", "data-case-files-target" => "filesField", form_group: { class: "govuk-!-display-none" } %>
+ <%= form.hidden_field :edit_form, value: @uploaded_files.any? ? true: false %>
+<% end %>
\ No newline at end of file
diff --git a/app/views/evaluation/upload_completed_documents/_uploaded_documents.html.erb b/app/views/evaluation/upload_completed_documents/_uploaded_documents.html.erb
new file mode 100644
index 000000000..96c671e32
--- /dev/null
+++ b/app/views/evaluation/upload_completed_documents/_uploaded_documents.html.erb
@@ -0,0 +1,44 @@
+
+
+
<%= I18n.t("support.cases.upload_documents.file_uploaded") %>
+
+
+
+
+
+
+
+ <% @uploaded_files.each do |uploaded_file| %>
+
+
+ <%= link_to uploaded_file.file_name, evaluation_download_document_path(@current_case, document_type: uploaded_file.class, document_id: uploaded_file.id), method: :put, class: "govuk-link" %>
+
+
+
+ <%= link_to I18n.t("generic.button.delete"),
+ evaluation_upload_completed_document_path(case_id: @current_case, document_id: uploaded_file),
+ method: :delete,
+ class: "govuk-link govuk-link--no-visited-state" %>
+
+
+
+ <% end %>
+
+
diff --git a/app/views/evaluation/upload_completed_documents/destroy.html.erb b/app/views/evaluation/upload_completed_documents/destroy.html.erb
new file mode 100644
index 000000000..53b400577
--- /dev/null
+++ b/app/views/evaluation/upload_completed_documents/destroy.html.erb
@@ -0,0 +1,13 @@
+<%= render partial: "support/cases/components/case_header", locals: { current_case: @current_case } %>
+
+ <%= I18n.t("support.cases.upload_documents.delete_confirmation", name:@uploaded_document.file_name) %>
+
+
+ <%= link_to I18n.t("generic.button.delete"),
+ evaluation_upload_completed_document_path(case_id: @current_case, confirm: true, document_id: @uploaded_document.id),
+ method: :delete,
+ class: "govuk-button govuk-button--warning" %>
+ <%= link_to I18n.t("generic.button.cancel"),
+ evaluation_upload_completed_document_path(@current_case),
+ class: "govuk-link govuk-link--no-visited-state" %>
+
\ No newline at end of file
diff --git a/app/views/evaluation/upload_completed_documents/show.html.erb b/app/views/evaluation/upload_completed_documents/show.html.erb
new file mode 100644
index 000000000..ac89ee3de
--- /dev/null
+++ b/app/views/evaluation/upload_completed_documents/show.html.erb
@@ -0,0 +1,9 @@
+<%= render partial: "support/cases/components/case_header",
+ locals: { current_case: @current_case } %>
+<%= I18n.t("evaluation.upload_evaluation.header") %>
+
+ <%= I18n.t("evaluation.upload_evaluation.page_body_text1") %>
+
+ <%= I18n.t("evaluation.upload_evaluation.page_body_text2") %>
+
+<%= render "form" %>
\ No newline at end of file
diff --git a/app/views/support/cases/document_uploads/_form.html.erb b/app/views/support/cases/document_uploads/_form.html.erb
index eb61e631b..d788918b7 100644
--- a/app/views/support/cases/document_uploads/_form.html.erb
+++ b/app/views/support/cases/document_uploads/_form.html.erb
@@ -34,5 +34,5 @@
<%= form.govuk_file_field :files, multiple: true, include_hidden: false, class: "govuk-!-display-none", "data-case-files-target" => "filesField", form_group: { class: "govuk-!-display-none" } %>
-
+ <%= form.hidden_field :edit_form, value: @uploaded_files.any? ? true: false %>
<% end %>
\ No newline at end of file
diff --git a/app/views/support/cases/show/_tasklist.html.erb b/app/views/support/cases/show/_tasklist.html.erb
index 5d85ec3d5..91dddb760 100644
--- a/app/views/support/cases/show/_tasklist.html.erb
+++ b/app/views/support/cases/show/_tasklist.html.erb
@@ -13,7 +13,7 @@
if @current_case.has_uploaded_documents == true
document_upload_Status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.complete"), colour: "green")
- elsif @current_case.has_uploaded_documents == false
+ elsif @current_case.has_uploaded_documents == false && @current_case.upload_documents.any?
document_upload_Status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.in_progress"))
else
document_upload_Status = govuk_tag(text: I18n.t("support.case.label.tasklist.status.to_do"))
diff --git a/config/locales/en.yml b/config/locales/en.yml
index d6170901b..6680d22e5 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -350,6 +350,11 @@ en:
evaluation_approved_by_dfe: Evaluation approved by DfE
download_documents:
header: Download documents
+ upload_evaluation:
+ header: Upload evaluation
+ page_body_text1: Upload your evaluation, this is usually only the scoring form but you can upload multiple files.
+ page_body_text2: DfE will then review and approve your evaluation. You will receive an email with instructions if any changes are required.
+ file_upload_confirmation: Have you uploaded all the completed documents?
exit_survey:
better_quality:
options:
diff --git a/config/routes.rb b/config/routes.rb
index e55f1d1d3..79fc60307 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -339,6 +339,7 @@
namespace :evaluation do
resources :download_documents, only: %i[show update]
+ resources :upload_completed_documents, except: %i[new], param: :case_id
resources :tasks, only: %i[show edit]
get "verify/evaluator/link/:id", to: "tasks#edit", as: :verify_evaluators_unique_link
end
diff --git a/db/migrate/20250116143149_add_support_evaluators_upload_documents.rb b/db/migrate/20250116143149_add_support_evaluators_upload_documents.rb
new file mode 100644
index 000000000..95a4b3940
--- /dev/null
+++ b/db/migrate/20250116143149_add_support_evaluators_upload_documents.rb
@@ -0,0 +1,14 @@
+class AddSupportEvaluatorsUploadDocuments < ActiveRecord::Migration[7.2]
+ def change
+ create_table "support_evaluators_upload_documents", id: :uuid do |t|
+ t.references "support_case", type: :uuid
+ t.string "email", null: false
+ t.string "file_type"
+ t.string "file_name"
+ t.bigint "file_size"
+ t.uuid "attachable_id"
+ t.string "attachable_type"
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20250117101341_add_has_uploaded_documents_to_support_evalutors.rb b/db/migrate/20250117101341_add_has_uploaded_documents_to_support_evalutors.rb
new file mode 100644
index 000000000..ecd32fe3f
--- /dev/null
+++ b/db/migrate/20250117101341_add_has_uploaded_documents_to_support_evalutors.rb
@@ -0,0 +1,5 @@
+class AddHasUploadedDocumentsToSupportEvalutors < ActiveRecord::Migration[7.2]
+ def change
+ add_column :support_evaluators, :has_uploaded_documents, :boolean
+ end
+end
diff --git a/db/migrate/20250131133341_update_has_uploaded_documents_default_value.rb b/db/migrate/20250131133341_update_has_uploaded_documents_default_value.rb
new file mode 100644
index 000000000..e5138c889
--- /dev/null
+++ b/db/migrate/20250131133341_update_has_uploaded_documents_default_value.rb
@@ -0,0 +1,6 @@
+class UpdateHasUploadedDocumentsDefaultValue < ActiveRecord::Migration[7.2]
+ def change
+ change_column_default :support_evaluators, :has_uploaded_documents, from: nil, to: false
+ change_column_default :support_cases, :has_uploaded_documents, from: nil, to: false
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index e048f7aeb..1f4916136 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema[7.2].define(version: 2025_01_10_150114) do
+ActiveRecord::Schema[7.2].define(version: 2025_01_31_133341) do
create_sequence "evaluation_refs"
create_sequence "framework_refs"
@@ -636,7 +636,7 @@
t.string "other_school_urns", default: [], array: true
t.boolean "is_evaluator", default: false
t.date "evaluation_due_date"
- t.boolean "has_uploaded_documents"
+ t.boolean "has_uploaded_documents", default: false
t.boolean "sent_email_to_evaluators", default: false
t.index ["category_id"], name: "index_support_cases_on_category_id"
t.index ["existing_contract_id"], name: "index_support_cases_on_existing_contract_id"
@@ -823,6 +823,8 @@
t.string "dsi_uid", default: "", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.boolean "has_uploaded_documents", default: false
+ t.boolean "evaluation_approved", default: false
t.index ["dsi_uid"], name: "index_support_evaluators_on_dsi_uid"
t.index ["email", "support_case_id"], name: "index_support_evaluators_on_email_and_support_case_id", unique: true
t.index ["support_case_id"], name: "index_support_evaluators_on_support_case_id"
@@ -840,6 +842,19 @@
t.index ["support_case_upload_document_id"], name: "idx_on_support_case_upload_document_id_fbb53116e2"
end
+ create_table "support_evaluators_upload_documents", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
+ t.uuid "support_case_id"
+ t.string "email", null: false
+ t.string "file_type"
+ t.string "file_name"
+ t.bigint "file_size"
+ t.uuid "attachable_id"
+ t.string "attachable_type"
+ t.datetime "created_at", null: false
+ t.datetime "updated_at", null: false
+ t.index ["support_case_id"], name: "index_support_evaluators_upload_documents_on_support_case_id"
+ end
+
create_table "support_frameworks", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
t.string "name"
t.string "supplier"
diff --git a/spec/features/evaluation/upload_completed_documents_spec.rb b/spec/features/evaluation/upload_completed_documents_spec.rb
new file mode 100644
index 000000000..35e36ec32
--- /dev/null
+++ b/spec/features/evaluation/upload_completed_documents_spec.rb
@@ -0,0 +1,107 @@
+require "rails_helper"
+RSpec.feature "Evaluator can can upload completed documents", :js, :with_csrf_protection do
+ let(:support_case) { create(:support_case) }
+ let(:user) { create(:user) }
+ let(:file_1) { fixture_file_upload(Rails.root.join("spec/fixtures/support/text-file.txt"), "text/plain") }
+ let(:file_2) { fixture_file_upload(Rails.root.join("spec/fixtures/support/another-text-file.txt"), "text/plain") }
+ let(:document_uploader) { support_case.document_uploader(files: [file_1, file_2]) }
+ let!(:support_evaluator) { create(:support_evaluator, support_case:, email: user.email, dsi_uid: user.dfe_sign_in_uid) }
+ let(:file_name_1) { "text-file.txt" }
+ let(:file_name_2) { "another-text-file.txt" }
+ let(:evaluator_task_status) { "#evaluator_task-2-status" }
+
+ before do
+ Current.user = user
+ user_exists_in_dfe_sign_in(user:)
+ user_is_signed_in(user:)
+ end
+
+ def visit_and_click_link(path, link_index)
+ visit path
+ find_all(".govuk-summary-list__row a")[link_index].click
+ end
+
+ def upload_documents
+ document_uploader.save!
+ visit_and_click_link(evaluation_download_document_path(support_case), 0)
+ visit_and_click_link(evaluation_download_document_path(support_case), 1)
+ end
+ specify "when no files are selected" do
+ upload_documents
+
+ visit evaluation_upload_completed_document_path(support_case)
+
+ expect(page).to have_text("Upload evaluation")
+ expect(page).to have_text("Upload a file")
+ expect(page).to have_text("Have you uploaded all the completed documents?")
+
+ click_button "Continue"
+
+ expect(page).to have_text("There is a problem")
+ expect(page).to have_text("Select files to upload")
+ end
+
+ specify "when files are uploaded and confirmation choosen as No (In progress)" do
+ upload_documents
+
+ support_evaluator.update!(has_uploaded_documents: false)
+
+ expect { document_uploader.save_evaluation_document!(user.email) }.to change { support_case.evaluators_upload_documents.count }.from(0).to(2)
+ expect(support_case.evaluators_upload_documents.pluck(:file_name)).to contain_exactly(file_name_1, file_name_2)
+ expect(support_case.evaluators_upload_documents.map { |a| a.file.attached? }.all?).to eq(true)
+
+ visit evaluation_task_path(support_case)
+
+ expect(find(evaluator_task_status)).to have_text("In progress")
+ end
+
+ specify "when files are uploaded and confirmation choosen as Yes (Complete)" do
+ upload_documents
+
+ support_evaluator.update!(has_uploaded_documents: true)
+
+ expect { document_uploader.save_evaluation_document!(user.email) }.to change { support_case.evaluators_upload_documents.count }.from(0).to(2)
+ expect(support_case.evaluators_upload_documents.pluck(:file_name)).to contain_exactly(file_name_1, file_name_2)
+ expect(support_case.evaluators_upload_documents.map { |a| a.file.attached? }.all?).to eq(true)
+
+ visit evaluation_task_path(support_case)
+
+ expect(find(evaluator_task_status)).to have_text("Complete")
+ end
+
+ specify "viewing uploaded files" do
+ upload_documents
+
+ support_evaluator.update!(has_uploaded_documents: true)
+
+ document_uploader.save_evaluation_document!(user.email)
+
+ visit evaluation_upload_completed_document_path(support_case)
+
+ expect(page).to have_content(file_name_1)
+ expect(page).to have_content(file_name_2)
+
+ find_all(".case-files__file-remove a")[0].click
+
+ expect(find(".govuk-button--warning")).to have_content("Delete")
+ expect(page).to have_content(file_name_1)
+ end
+
+ specify "when all files are deleted" do
+ upload_documents
+
+ support_case.reload
+
+ support_case.evaluators_upload_documents(&:destroy!)
+
+ support_case.reload
+
+ support_evaluator.update!(has_uploaded_documents: nil)
+
+ expect(support_case.evaluators_upload_documents.count).to eq(0)
+
+ visit evaluation_task_path(support_case)
+
+ expect(find(evaluator_task_status, wait: 10)).to have_text("To do")
+ end
+end
diff --git a/spec/features/support/agent_can_upload_evaluation_documents_spec.rb b/spec/features/support/agent_can_upload_evaluation_documents_spec.rb
index f4038c15f..b9313f494 100644
--- a/spec/features/support/agent_can_upload_evaluation_documents_spec.rb
+++ b/spec/features/support/agent_can_upload_evaluation_documents_spec.rb
@@ -19,7 +19,6 @@
expect(page).to have_text("There is a problem")
expect(page).to have_text("Select files to upload")
- expect(page).to have_text("Please confirm that you uploaded all documents")
end
specify "when files are uploaded and confirmation choosen as No (In progress)" do