From e8940447e268ef8f893727789bc23aef0caf9c2a Mon Sep 17 00:00:00 2001 From: Joseph Simmons Date: Wed, 21 Feb 2024 17:05:36 -0600 Subject: [PATCH 1/2] Changes Project ID to Project Name, and puts the error column at the end --- app/services/order_row_importer.rb | 5 ++++ public/templates/bulk_import_template.csv | 2 +- .../projects/order_row_importer_extension.rb | 12 +++++++++- vendor/engines/projects/config/locales/en.yml | 4 +++- .../engines/projects/lib/projects/engine.rb | 2 +- .../order_row_importer_extension_spec.rb | 24 ++++++++++++++----- 6 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/services/order_row_importer.rb b/app/services/order_row_importer.rb index dffd8ec417..4452af4c91 100644 --- a/app/services/order_row_importer.rb +++ b/app/services/order_row_importer.rb @@ -216,6 +216,7 @@ def validate_fields validate_product validate_account validate_existing_order + validate_custom_attributes end end @@ -293,4 +294,8 @@ def validate_existing_order add_error(:order_user_mismatch) end end + + # Projects adds a custom attribute and overrides this method to validate it + def validate_custom_attributes + end end diff --git a/public/templates/bulk_import_template.csv b/public/templates/bulk_import_template.csv index 6f98a7f587..5c065161e4 100644 --- a/public/templates/bulk_import_template.csv +++ b/public/templates/bulk_import_template.csv @@ -1 +1 @@ -Netid / Email,Chart String,Product Name,Quantity,Order Date,Fulfillment Date,Note,Order,Reference ID +Netid / Email,Chart String,Product Name,Quantity,Order Date,Fulfillment Date,Note,Order,Reference ID,Project Name diff --git a/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb b/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb index 8251b3cc7c..fcaeabc1f9 100644 --- a/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb +++ b/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb @@ -2,10 +2,20 @@ module Projects module OrderRowImporterExtension + def validate_custom_attributes + if field(:project_name) && project.nil? + add_error(:project_not_found) + end + end + private + def project + facility.projects.active.find_by name: field(:project_name) + end + def custom_attributes - { project_id: field(:project_id) } + { project_id: project&.id } end end diff --git a/vendor/engines/projects/config/locales/en.yml b/vendor/engines/projects/config/locales/en.yml index 990041a59f..3c6163c6b6 100644 --- a/vendor/engines/projects/config/locales/en.yml +++ b/vendor/engines/projects/config/locales/en.yml @@ -22,7 +22,9 @@ en: order_row_importer: headers: - project_id: Project ID + project_name: Project Name + errors: + project_not_found: Project not found projects: projects: edit: diff --git a/vendor/engines/projects/lib/projects/engine.rb b/vendor/engines/projects/lib/projects/engine.rb index afe9d61968..6e754a47c2 100644 --- a/vendor/engines/projects/lib/projects/engine.rb +++ b/vendor/engines/projects/lib/projects/engine.rb @@ -16,7 +16,7 @@ class Engine < Rails::Engine OrdersController.send :include, Projects::OrdersControllerExtension Reservation.send :include, Projects::ReservationExtension OrderRowImporter.send :prepend, Projects::OrderRowImporterExtension - OrderRowImporter.order_import_headers.concat [:project_id] + OrderRowImporter.order_import_headers.insert(-2, :project_name) ViewHook.add_hook "reservations.account_field", "after_account", diff --git a/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb b/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb index ee877a61dc..ab632ffa68 100644 --- a/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb +++ b/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb @@ -9,6 +9,7 @@ let!(:account_api_record) { create(Settings.testing.api_account_factory.to_sym, account_number: account.account_number) } if Settings.testing.api_account_factory let(:facility) { create(:setup_facility) } let(:project) { create(:project, facility:) } + let(:project_name) { project.name } let(:order_import) { build(:order_import, creator: user, facility:) } let(:service) { create(:setup_service, facility:) } let(:user) { create(:user) } @@ -30,7 +31,7 @@ "Fulfillment Date" => fulfillment_date, "Note" => "This is a note", "Reference ID" => reference_id, - "Project ID" => project.id, + "Project Name" => project_name, } CSV::Row.new(ref.keys, ref.values) end @@ -40,10 +41,21 @@ end describe "#import" do - it "creates an order detail with a project" do - subject.import - expect(subject.errors).to be_empty - expect(OrderDetail.last.project_id).to eq project.id + context "with existing project name" do + it "creates an order detail with a project" do + subject.import + expect(subject.errors).to be_empty + expect(OrderDetail.last.project_id).to eq project.id + end + end + + context "with non-existing project name" do + let(:project_name) { "Non-existing project" } + + it "produces and error" do + subject.import + expect(subject.errors).to eq ["Project not found"] + end end end @@ -59,8 +71,8 @@ "Note", "Order", "Reference ID", + "Project Name", "Errors", - "Project ID", ], ) end From 44503a9c3998ff561f0cbb3305db4eee969f1604 Mon Sep 17 00:00:00 2001 From: Joseph Simmons Date: Wed, 21 Feb 2024 17:30:52 -0600 Subject: [PATCH 2/2] Fixes spec error, handles case for empty project name --- .../concerns/projects/order_row_importer_extension.rb | 2 +- .../projects/order_row_importer_extension_spec.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb b/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb index fcaeabc1f9..aa1c76e052 100644 --- a/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb +++ b/vendor/engines/projects/app/models/concerns/projects/order_row_importer_extension.rb @@ -3,7 +3,7 @@ module Projects module OrderRowImporterExtension def validate_custom_attributes - if field(:project_name) && project.nil? + if field(:project_name).present? && project.nil? add_error(:project_not_found) end end diff --git a/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb b/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb index ab632ffa68..52d5507008 100644 --- a/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb +++ b/vendor/engines/projects/spec/models/projects/order_row_importer_extension_spec.rb @@ -57,6 +57,16 @@ expect(subject.errors).to eq ["Project not found"] end end + + context "with an empty string as a project name" do + let(:project_name) { "" } + + it "creates an order detail with no project" do + subject.import + expect(subject.errors).to be_empty + expect(OrderDetail.last.project_id).to be_nil + end + end end it "has all of the columns in the correct order" do