diff --git a/app/components/bulk_upload_summary_component.html.erb b/app/components/bulk_upload_summary_component.html.erb
new file mode 100644
index 000000000..f89c3d9a7
--- /dev/null
+++ b/app/components/bulk_upload_summary_component.html.erb
@@ -0,0 +1,35 @@
+
+
+
+
+
+
Uploaded by: <%= bulk_upload.user.name %> (<%= bulk_upload.user.email %>)
+
Uploading organisation: <%= bulk_upload.user.organisation.name %>
+
Time of upload: <%= bulk_upload.created_at.to_formatted_s(:govuk_date_and_time) %>
+
+
+ <%= download_file_link %>
+ <%= view_error_report_link %>
+ <%= view_logs_link %>
+
+
+
+
+
diff --git a/app/components/bulk_upload_summary_component.rb b/app/components/bulk_upload_summary_component.rb
new file mode 100644
index 000000000..c1168d3fc
--- /dev/null
+++ b/app/components/bulk_upload_summary_component.rb
@@ -0,0 +1,29 @@
+class BulkUploadSummaryComponent < ViewComponent::Base
+ include BulkUploadHelper
+
+ attr_reader :bulk_upload
+
+ def initialize(bulk_upload:)
+ @bulk_upload = bulk_upload
+ @bulk_upload_errors = bulk_upload.bulk_upload_errors
+ super
+ end
+
+ def upload_status
+ helpers.status_tag("in_progress")
+ end
+
+ def setup_errors_count
+ @bulk_upload_errors.where(category: "setup").count
+ end
+
+ def critical_errors_count
+ @bulk_upload_errors.where(category: [nil, ""]).count
+ end
+
+ def potential_errors_count
+ @bulk_upload_errors.where(category: "soft_validations").count
+ end
+
+
+end
diff --git a/app/components/create_log_actions_component.html.erb b/app/components/create_log_actions_component.html.erb
index 1b6bd8aca..f956ecb54 100644
--- a/app/components/create_log_actions_component.html.erb
+++ b/app/components/create_log_actions_component.html.erb
@@ -3,8 +3,11 @@
<% if create_button_href.present? %>
<%= govuk_button_to create_button_copy, create_button_href, class: "govuk-!-margin-right-6" %>
<% end %>
- <% if upload_button_href.present? %>
+ <% if upload_button_href.present? && !user.support? %>
<%= govuk_button_link_to upload_button_copy, upload_button_href, secondary: true %>
<% end %>
+ <% if view_uploads_button_href.present? && user.support? %>
+ <%= govuk_button_link_to view_uploads_button_copy, view_uploads_button_href, secondary: true %>
+ <% end %>
<% end %>
diff --git a/app/components/create_log_actions_component.rb b/app/components/create_log_actions_component.rb
index 4b451c2cc..59a91b96a 100644
--- a/app/components/create_log_actions_component.rb
+++ b/app/components/create_log_actions_component.rb
@@ -53,4 +53,22 @@ class CreateLogActionsComponent < ViewComponent::Base
bulk_upload_sales_log_path(id: "start")
end
end
+
+ def view_uploads_button_copy
+ case log_type
+ when "lettings"
+ "View lettings logs in bulk"
+ when "sales"
+ "View sales logs in bulk"
+ end
+ end
+
+ def view_uploads_button_href
+ case log_type
+ when "lettings"
+ bulk_uploads_lettings_logs_path
+ when "sales"
+ bulk_uploads_sales_logs_path
+ end
+ end
end
diff --git a/app/components/search_component.rb b/app/components/search_component.rb
index 36d621240..2d10781d3 100644
--- a/app/components/search_component.rb
+++ b/app/components/search_component.rb
@@ -19,6 +19,10 @@ class SearchComponent < ViewComponent::Base
request.path
elsif request.path.include?("organisations") && request.path.include?("managing-agents")
request.path
+ elsif request.path.include?("bulk-uploads") && request.path.include?("sales-logs")
+ request.path
+ elsif request.path.include?("bulk-uploads") && request.path.include?("lettings-logs")
+ request.path
elsif request.path.include?("users")
user_path(current_user)
elsif request.path.include?("organisations")
diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb
index 491d92372..630e2c9c9 100644
--- a/app/controllers/lettings_logs_controller.rb
+++ b/app/controllers/lettings_logs_controller.rb
@@ -115,6 +115,17 @@ class LettingsLogsController < LogsController
end
end
+ def bulk_uploads
+ uploads = BulkUpload.lettings.where("created_at >= ?", 30.days.ago)
+ # unpaginated_filtered_uploads = filter_manager.filtered_uploads(uploads, search_term, session_filters)
+
+ @pagy, @bulk_uploads = pagy(uploads)
+ @search_term = search_term
+ @searched = search_term.presence
+ @filter_type = "lettings_bulk_uploads"
+ render "bulk_upload_shared/uploads"
+ end
+
private
def session_filters
diff --git a/app/controllers/sales_logs_controller.rb b/app/controllers/sales_logs_controller.rb
index 7c4d8aa60..288ab8477 100644
--- a/app/controllers/sales_logs_controller.rb
+++ b/app/controllers/sales_logs_controller.rb
@@ -85,6 +85,17 @@ class SalesLogsController < LogsController
params.require(:sales_log).permit(SalesLog.editable_fields)
end
+ def bulk_uploads
+ uploads = BulkUpload.sales.where("created_at >= ?", 30.days.ago)
+ # unpaginated_filtered_uploads = filter_manager.filtered_uploads(uploads, search_term, session_filters)
+
+ @pagy, @bulk_uploads = pagy(uploads)
+ @search_term = search_term
+ @searched = search_term.presence
+ @filter_type = "sales_bulk_uploads"
+ render "bulk_upload_shared/uploads"
+ end
+
private
def session_filters
diff --git a/app/helpers/bulk_upload_helper.rb b/app/helpers/bulk_upload_helper.rb
new file mode 100644
index 000000000..4ea3e185e
--- /dev/null
+++ b/app/helpers/bulk_upload_helper.rb
@@ -0,0 +1,49 @@
+module BulkUploadHelper
+ def bulk_upload_title(controller)
+ case controller.controller_name
+ when "lettings_logs"
+ "Lettings Bulk Uploads"
+ when "sales_logs"
+ "Sales Bulk Uploads"
+ else
+ "Bulk Uploads"
+ end
+ end
+
+ def bulk_upload_details(bulk_upload)
+ content_tag(:span) do
+ concat("Uploaded by: #{bulk_upload.user.name} (#{bulk_upload.user.email})
".html_safe)
+ concat("Uploading organisation: #{bulk_upload.user.organisation.name}
".html_safe)
+ concat("Time of upload: #{bulk_upload.created_at.to_formatted_s(:govuk_date)}".html_safe)
+ end
+ end
+
+ def formatted_count_text(count, singular_text, plural_text = nil)
+ return if count.nil? || count <= 0
+
+ text = count > 1 ? (plural_text || singular_text.pluralize(count)) : singular_text
+ content_tag(:p, class: "govuk-hint govuk-!-font-size-16 govuk-!-margin-bottom-1") do
+ concat(content_tag(:strong, count))
+ concat(" #{text}")
+ end
+ end
+
+ def counts(*counts_with_texts)
+ counts_with_texts.map { |count, singular_text, plural_text|
+ formatted_count_text(count, singular_text, plural_text) if count.present?
+ }.compact.join("").html_safe
+ end
+
+ def download_file_link
+ link_to "Download file", "#", class: "govuk-link govuk-!-margin-right-2"
+ end
+
+ def view_error_report_link
+ link_to "View error report", "#", class: "govuk-link"
+ end
+
+ def view_logs_link
+ link_to "View logs", "#", class: "govuk-link"
+ end
+
+end
diff --git a/app/views/bulk_upload_shared/_upload_filters.html.erb b/app/views/bulk_upload_shared/_upload_filters.html.erb
new file mode 100644
index 000000000..e69de29bb
diff --git a/app/views/bulk_upload_shared/_upload_list.html.erb b/app/views/bulk_upload_shared/_upload_list.html.erb
new file mode 100644
index 000000000..7b6057228
--- /dev/null
+++ b/app/views/bulk_upload_shared/_upload_list.html.erb
@@ -0,0 +1,15 @@
+
+
+
+ <%= render(SearchResultCaptionComponent.new(searched:, count: pagy.count, item_label:, total_count:, item: "files uploaded in the last 30 days", filters_count: applied_filters_count(@filter_type))) %>
+
+
+ <% if searched || applied_filters_count(@filter_type).positive? %>
+
+ <% end %>
+
+
+
+<% bulk_uploads.map do |bulk_upload| %>
+ <%= render BulkUploadSummaryComponent.new(bulk_upload:) %>
+<% end %>
diff --git a/app/views/bulk_upload_shared/uploads.html.erb b/app/views/bulk_upload_shared/uploads.html.erb
new file mode 100644
index 000000000..34053e125
--- /dev/null
+++ b/app/views/bulk_upload_shared/uploads.html.erb
@@ -0,0 +1,28 @@
+<% item_label = format_label(@pagy.count, "uploads") %>
+<% title = format_title(@searched, "Lettings bulk uploads", current_user, item_label, @pagy.count, nil) %>
+
+<% content_for :title, title %>
+
+
+ <%= "#{log_type_for_controller(controller).capitalize} bulk uploads" %>
+
+
+
+ <%= render partial: "bulk_upload_shared/upload_filters" %>
+
+
+ <%= render SearchComponent.new(current_user:, search_label: "Search by file name, user's name or email, or organisation", value: @searched) %>
+ <%= govuk_section_break(visible: true, size: "m") %>
+ <%= render partial: "bulk_upload_shared/upload_list",
+ locals: {
+ bulk_uploads: @bulk_uploads,
+ title: "Bulk uploads",
+ pagy: @pagy,
+ searched: @searched,
+ item_label:,
+ total_count: @total_count,
+ filter_type: @filter_type,
+ } %>
+ <%== render partial: "pagy/nav", locals: { pagy: @pagy, item_name: "bulk uploads" } %>
+
+
diff --git a/config/routes.rb b/config/routes.rb
index f2c86e37c..bbb32d58e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -236,6 +236,7 @@ Rails.application.routes.draw do
get "csv-download", to: "lettings_logs#download_csv"
post "email-csv", to: "lettings_logs#email_csv"
get "csv-confirmation", to: "lettings_logs#csv_confirmation"
+ get "bulk-uploads", to: "lettings_logs#bulk_uploads"
get "delete-logs", to: "delete_logs#delete_lettings_logs"
post "delete-logs", to: "delete_logs#delete_lettings_logs_with_selected_ids"
@@ -308,6 +309,7 @@ Rails.application.routes.draw do
get "csv-download", to: "sales_logs#download_csv"
post "email-csv", to: "sales_logs#email_csv"
get "csv-confirmation", to: "sales_logs#csv_confirmation"
+ get "bulk-uploads", to: "sales_logs#bulk_uploads"
get "delete-logs", to: "delete_logs#delete_sales_logs"
post "delete-logs", to: "delete_logs#delete_sales_logs_with_selected_ids"