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" %> +
+
+ <%= I18n.t("evaluation.upload_evaluation.file_upload_confirmation") %> +
+
+ <%= form.radio_button :has_uploaded_documents, true, checked: current_evaluator.present? && current_evaluator.has_uploaded_documents == true, class: "govuk-radios__input" %> + <%= form.label :has_uploaded_documents, "Yes, I have uploaded all documents", value: true, class: "govuk-label govuk-radios__label" %> +
+
+ <%= form.radio_button :has_uploaded_documents, false, checked: current_evaluator.present? && current_evaluator.has_uploaded_documents == false, class: "govuk-radios__input" %> + <%= form.label :has_uploaded_documents, "No", value: false, class: "govuk-label govuk-radios__label" %> +
+
+
+
+
+ <%= 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