From 93d3bfe267fd3d4178cb31c95f42fe044e57a961 Mon Sep 17 00:00:00 2001 From: Joaquin <20804419+joaquinco@users.noreply.github.com> Date: Fri, 7 Mar 2025 17:26:02 -0300 Subject: [PATCH] [NU-57] Bulk orders import event log (#5079) * Fix order import active tab * Create log event on create order import --- app/controllers/order_imports_controller.rb | 23 +++++--- app/models/order_import.rb | 6 +- .../admin/shared/_tabnav_order.html.haml | 2 +- config/locales/views/admin/en.log_events.yml | 2 + .../order_imports_controller_spec.rb | 55 +++++++++++++++++-- spec/models/order_import_spec.rb | 17 ++++-- 6 files changed, 85 insertions(+), 20 deletions(-) diff --git a/app/controllers/order_imports_controller.rb b/app/controllers/order_imports_controller.rb index 37e03416fa..1b4a0292a4 100644 --- a/app/controllers/order_imports_controller.rb +++ b/app/controllers/order_imports_controller.rb @@ -46,13 +46,22 @@ def create_params end def create_order_import! - OrderImport.create!( - create_params.merge( - created_by: session_user.id, - upload_file: stored_file, - facility: @current_facility, - ), - ) + OrderImport.transaction do + order_import = OrderImport.create!( + create_params.merge( + created_by: session_user.id, + upload_file: stored_file, + facility: @current_facility, + ), + ) + LogEvent.log( + order_import, + :created, + session_user, + ) + + order_import + end end def import_exception_alert(exception) diff --git a/app/models/order_import.rb b/app/models/order_import.rb index c566457b16..5c15acab9f 100644 --- a/app/models/order_import.rb +++ b/app/models/order_import.rb @@ -68,11 +68,15 @@ def error_mode? @in_error_mode end + def to_s + upload_file.name + end + private def create_order_from_imported_row!(row_importer) Order.create!( - facility: facility, + facility:, account: row_importer.account, user: row_importer.user, created_by_user: creator, diff --git a/app/views/admin/shared/_tabnav_order.html.haml b/app/views/admin/shared/_tabnav_order.html.haml index 511e2a1165..610e0c7bb0 100644 --- a/app/views/admin/shared/_tabnav_order.html.haml +++ b/app/views/admin/shared/_tabnav_order.html.haml @@ -3,4 +3,4 @@ - if current_ability.can?(:show_problems, Order) = display_tab text("problem_orders"), show_problems_facility_orders_path, action: :show_problems - if current_ability.can?(:new, OrderImport) - = tab text("add_new"), new_facility_order_import_path(current_facility), (controller.controller_name == 'facility_orders_import') + = tab text("add_new"), new_facility_order_import_path(current_facility), (controller.controller_name == "order_imports") diff --git a/config/locales/views/admin/en.log_events.yml b/config/locales/views/admin/en.log_events.yml index 92b28cfd44..438258b5ec 100644 --- a/config/locales/views/admin/en.log_events.yml +++ b/config/locales/views/admin/en.log_events.yml @@ -33,6 +33,8 @@ en: price_change: Order's price was manually changed resolve_from_problem_queue: Problem order resolved updated_fulfilled_at: Fulfilled date updated on completed order + order_import: + created: Bulk Order Import product_user: create: User added to access list delete: User removed from access list diff --git a/spec/controllers/order_imports_controller_spec.rb b/spec/controllers/order_imports_controller_spec.rb index 043fbbe822..9f69dc9f53 100644 --- a/spec/controllers/order_imports_controller_spec.rb +++ b/spec/controllers/order_imports_controller_spec.rb @@ -22,7 +22,7 @@ def fixture_file(filename) @params = { facility_id: facility.url_name } end - context "starting an import" do + describe "new" do before :each do @action = :new @method = :get @@ -34,19 +34,64 @@ def fixture_file(filename) end end - context "importing orders" do + describe "create" do before :each do @action = :create @method = :post @params.merge!( order_import: { - upload_file: upload_file, - fail_on_error: fail_on_error, - send_receipts: send_receipts, + upload_file:, + fail_on_error:, + send_receipts:, }, ) end + describe "log event creation" do + let(:user) { @admin } + let(:send_receipts) { false } + let(:fail_on_error) { false } + + before { sign_in user } + + context "on success" do + let(:upload_file) { fixture_file("blank.csv") } + + it "creates an order import" do + expect { do_request }.to( + change { OrderImport.count }.by(1) + ) + end + + it "creates a log event on success" do + expect { do_request }.to( + change do + LogEvent.where( + user:, + event_type: :created, + ).count + end.by(1) + ) + end + end + + context "on error" do + let(:upload_file) { nil } + + it "does not create an order import" do + expect { do_request }.to_not( + change { OrderImport.count } + ) + end + + it "does not create a log event" do + expect { do_request }.to_not( + change { LogEvent.count } + ) + end + end + end + context "when the file is blank" do let(:upload_file) { fixture_file("blank.csv") } let(:fail_on_error) { false } diff --git a/spec/models/order_import_spec.rb b/spec/models/order_import_spec.rb index 154a7cbe6a..b31b737851 100644 --- a/spec/models/order_import_spec.rb +++ b/spec/models/order_import_spec.rb @@ -6,7 +6,6 @@ require "stringio" RSpec.describe OrderImport, :time_travel do - CSV_HEADERS = [ I18n.t("order_row_importer.headers.user"), I18n.t("Chart_string"), @@ -28,14 +27,14 @@ def nucore_format_date(date) OrderImport.create!( created_by: director.id, upload_file: stored_file, - facility: facility, + facility:, ) end let(:account) do create(:nufs_account, description: "dummy account", - account_users_attributes: account_users_attributes, + account_users_attributes:, ) end @@ -54,7 +53,7 @@ def nucore_format_date(date) order_import.error_file.read_attached_file.split("\n").count end let(:facility) { create(:facility) } - let(:facility_account) { create(:facility_account, facility: facility) } + let(:facility_account) { create(:facility_account, facility:) } let(:fiscal_year_beginning) { SettingsHelper.fiscal_year_beginning } let(:guest) { @guest } let(:guest2) { create(:user, username: "guest2") } @@ -85,8 +84,8 @@ def nucore_format_date(date) before :each do grant_role(director, facility) - price_group = FactoryBot.create(:price_group, facility: facility) - create(:account_price_group_member, account: account, price_group: price_group) + price_group = FactoryBot.create(:price_group, facility:) + create(:account_price_group_member, account:, price_group:) item.item_price_policies.create!(attributes_for(:item_price_policy, price_group_id: price_group.id, start_date: fiscal_year_beginning, @@ -97,6 +96,12 @@ def nucore_format_date(date) )) end + describe "#to_s" do + it "is the filename" do + expect(subject.to_s).to eq(stored_file.name) + end + end + shared_examples_for "it does not send notifications" do it "does not send notifications" do expect(PurchaseNotifier).to receive(:order_receipt).never