Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SC-86 Evaluator journey: Upload complete evaluation #2024

Merged
merged 3 commits into from
Feb 5, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions app/controllers/evaluation/download_documents_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand All @@ -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
Expand All @@ -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(
{
Expand Down
5 changes: 5 additions & 0 deletions app/controllers/evaluation/tasks_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,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)
Expand Down Expand Up @@ -56,5 +57,9 @@ def authenticate_user!

session[:email_evaluator_link] = evaluation_task_path(id: params[:id], host: request.host)
end

def uploaded_evalaution_files
@uploaded_evalaution_files ||= Support::EvaluatorsUploadDocument.where(support_case_id: params[:id], email: current_user.email)
end
end
end
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -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_download_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_download_document
evaluator_download_document.destroy!
end

if @uploaded_files.empty?
reset_uploaded_documents
Expand All @@ -42,15 +46,15 @@ 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
params.require(:document_uploader).permit(:has_uploaded_documents)
end

def reset_uploaded_documents
@current_case.update!(has_uploaded_documents: nil)
@current_case.update!(has_uploaded_documents: false)
end
end
end
1 change: 1 addition & 0 deletions app/controllers/support/document_downloads_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ class DocumentDownloadsController < Cases::ApplicationController
"EnergyBill",
"Support::EmailTemplateAttachment",
"Support::CaseUploadDocument",
"Support::EvaluatorsUploadDocument",
].freeze

def show
Expand Down
2 changes: 2 additions & 0 deletions app/models/support/case.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 14 additions & 0 deletions app/models/support/case/document_uploadable.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
9 changes: 6 additions & 3 deletions app/models/support/case/document_uploader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions app/models/support/evaluators_upload_document.rb
Original file line number Diff line number Diff line change
@@ -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
8 changes: 8 additions & 0 deletions app/presenters/support/case_presenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,14 @@ def next_key_date_description_formatted
simple_format(next_key_date_description, class: "govuk-body")
end

def document_upload_complete?
has_uploaded_documents
end

def document_upload_in_progress?
!has_uploaded_documents && upload_documents.any?
end

private

# @return [String] 20 March 2021 at 12:00
Expand Down
2 changes: 1 addition & 1 deletion app/views/evaluation/download_documents/show.html.erb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<%= render partial: "support/cases/components/case_header",
locals: { current_case: @current_case } %>
<h1 class="govuk-heading-l"><%= I18n.t("evaluation.download_documents.header") %></h1>
<p class="govuk-body">Use these documents to complete your evaluation of each supplier</p>
<p class="govuk-body">Use these documents to complete your evaluation of each supplier.</p>
<p class="govuk-body govuk-!-static-margin-bottom-8">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" %>
Expand Down
16 changes: 14 additions & 2 deletions app/views/evaluation/tasks/show.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -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 |
Expand Down
39 changes: 39 additions & 0 deletions app/views/evaluation/upload_completed_documents/_form.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<%= form_with model: @document_uploader, scope: :document_uploader, url: evaluation_upload_completed_documents_path,
html: { "data-controller" => "case-files" } do |form| %>

<h2 class="govuk-heading-m"><%= I18n.t("support.cases.upload_documents.choose_file_title") %></h2>

<%= form.govuk_error_summary %>

<span class="govuk-button govuk-button--secondary" role="button"
data-case-files-target="btnDisplayFileDialog">
<%= I18n.t("support.cases.upload_documents.button.choose_file") %>
</span>

<%= render "uploaded_documents" %>

<div class="govuk-form-group govuk-!-margin-top-7">
<fieldset class="govuk-fieldset">
<legend class="govuk-fieldset__legend govuk-fieldset__legend--s"><%= I18n.t("evaluation.upload_evaluation.file_upload_confirmation") %></legend>
<div class="govuk-radios">
<div class="govuk-radios__item">
<%= 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" %>
</div>
<div class="govuk-radios__item">
<%= 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" %>
</div>
</div>
</fieldset>
</div>

<div class="govuk-button-group flex-align-center">
<%= 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" %>
</div>

<%= 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 %>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<h3 class="govuk-heading-s govuk-!-margin-bottom-2"><%= I18n.t("support.cases.upload_documents.file_uploaded") %></h3>
</div>
</div>

<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<div class="govuk-!-display-none" data-case-files-target="fileList">
<div data-case-files-target="filePreview">
<div data-case-files-target="previewTemplate">
<div class="case-files__file">
<span class="case-files__file-name" data-dz-name></span>
<div class="case-files__file-actions">
<span class="case-files__file-remove">
<a class="govuk-link govuk-link--no-visited-state" href="#" data-dz-remove><%= I18n.t("generic.button.delete") %></a>
</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

<div class="govuk-grid-row">
<div class="govuk-grid-column-two-thirds">
<% @uploaded_files.each do |uploaded_file| %>
<div class="case-files__file">
<span class="case-files__file-name">
<%= 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" %>
</span>
<div class="case-files__file-actions">
<span class="case-files__file-remove">
<%= 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" %>
</span>
</div>
</div>
<% end %>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<%= render partial: "support/cases/components/case_header", locals: { current_case: @current_case } %>
<h1 class="govuk-heading-l">
<%= I18n.t("support.cases.upload_documents.delete_confirmation", name:@uploaded_document.file_name) %>
</h1>
<div class="govuk-button-group flex-align-center">
<%= 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" %>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<%= render partial: "support/cases/components/case_header",
locals: { current_case: @current_case } %>
<h1 class="govuk-heading-l"><%= I18n.t("evaluation.upload_evaluation.header") %></h1>
<p class="govuk-body">
<%= I18n.t("evaluation.upload_evaluation.page_body_text1") %>
<br>
<%= I18n.t("evaluation.upload_evaluation.page_body_text2") %>
</p>
<%= render "form" %>
Loading