From 640f3168bc6928f8661208f1abdbf03d65bd772e Mon Sep 17 00:00:00 2001 From: Gregor Lasnibat Date: Tue, 12 Mar 2024 17:11:45 +0100 Subject: [PATCH] (dev) Detect duplicated item IDs when parsing a spreadsheet [SCI-10399] --- app/controllers/repositories_controller.rb | 6 ++++++ app/services/spreadsheet_parser.rb | 8 ++++++++ .../repository_import_parser/importer.rb | 17 +++++++++++++---- .../repositories/_parse_records_modal.html.erb | 5 +++++ config/locales/en.yml | 1 + 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 98fe0a5a2..249089ccf 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -278,6 +278,12 @@ class RepositoriesController < ApplicationController items_size: Constants::IMPORT_REPOSITORY_ITEMS_LIMIT) ) else + sheet = SpreadsheetParser.open_spreadsheet(import_params[:file]) + duplicate_ids = SpreadsheetParser.duplicate_ids(sheet) + if duplicate_ids.any? + @importing_duplicates_warning = t('repositories.import_records.error_message.importing_duplicates', duplicate_ids: duplicate_ids) + end + @import_data = parsed_file.data if @import_data.header.blank? || @import_data.columns.blank? diff --git a/app/services/spreadsheet_parser.rb b/app/services/spreadsheet_parser.rb index fbdbe6ebd..c12b438a9 100644 --- a/app/services/spreadsheet_parser.rb +++ b/app/services/spreadsheet_parser.rb @@ -66,4 +66,12 @@ class SpreadsheetParser row.map(&:to_s) end end + + def self.duplicate_ids(sheet) + # Extracting IDs from sheet and removing header row + ids = sheet.drop(1).map(&:first) + + # Selecting duplicate IDs + ids.group_by { |id| id }.select { |_, group| group.size > 1 }.keys + end end diff --git a/app/utilities/repository_import_parser/importer.rb b/app/utilities/repository_import_parser/importer.rb index 1e97b3f21..05e2786d4 100644 --- a/app/utilities/repository_import_parser/importer.rb +++ b/app/utilities/repository_import_parser/importer.rb @@ -57,6 +57,7 @@ module RepositoryImportParser def import_rows!(can_edit_existing_items, should_overwrite_with_empty_cells) errors = false + duplicate_ids = SpreadsheetParser.duplicate_ids(@sheet) @repository.transaction do batch_counter = 0 @@ -66,6 +67,9 @@ module RepositoryImportParser # Skip empty rows next if row.blank? + # Skip duplicates + next if duplicate_ids.include?(row.first) + unless @header_skipped @header_skipped = true next @@ -82,11 +86,8 @@ module RepositoryImportParser incoming_row.each_with_index do |value, index| if index == @name_index - # extract row_id - row_id = try_decimal_to_string(value) - # check if row (inventory) already exists - existing_row = RepositoryRow.find_by(name: row_id, repository: @repository) + existing_row = RepositoryRow.find_by(id: incoming_row[0]) # if it doesn't exist create it unless existing_row @@ -145,7 +146,15 @@ module RepositoryImportParser end def import_batch_to_database(full_row_import_batch, can_edit_existing_items, should_overwrite_with_empty_cells) + skipped_rows = [] + full_row_import_batch.each do |full_row| + # skip archived rows and rows that belong to other repositories + if full_row[:repository_row].archived || full_row[:repository_row].repository_id != @repository.id + skipped_rows << full_row[:repository_row] + next + end + full_row[:repository_row].save!(validate: false) @new_rows_added += 1 diff --git a/app/views/repositories/_parse_records_modal.html.erb b/app/views/repositories/_parse_records_modal.html.erb index f1072461e..df2a0d056 100644 --- a/app/views/repositories/_parse_records_modal.html.erb +++ b/app/views/repositories/_parse_records_modal.html.erb @@ -84,6 +84,11 @@ + <% if @importing_duplicates_warning %> +
+ <%= @importing_duplicates_warning %> +
+ <% end %>