diff --git a/app/models/product_import/entry_processor.rb b/app/models/product_import/entry_processor.rb index d33d417608..9afb1e3087 100644 --- a/app/models/product_import/entry_processor.rb +++ b/app/models/product_import/entry_processor.rb @@ -5,6 +5,7 @@ module ProductImport class EntryProcessor delegate :products_reset_count, to: :reset_absent + delegate :importing_into_inventory?, to: :settings attr_reader :inventory_created, :inventory_updated, :products_created, :variants_created, :variants_updated, :supplier_products, :total_supplier_products, :import_settings @@ -24,6 +25,8 @@ module ProductImport @variants_updated = 0 @supplier_products = {} @total_supplier_products = 0 + + @settings = Settings.new(import_settings) end def save_all(entries) @@ -79,12 +82,10 @@ module ProductImport @editable_enterprises.value?(Integer(supplier_id)) end - def importing_into_inventory? - import_settings[:settings] && import_settings[:settings]['import_into'] == 'inventories' - end - private + attr_reader :settings + def save_to_inventory(entry) save_new_inventory_item entry if entry.validates_as? 'new_inventory_item' save_existing_inventory_item entry if entry.validates_as? 'existing_inventory_item' @@ -183,8 +184,6 @@ module ProductImport end def assign_defaults(object, entry) - settings = Settings.new(import_settings) - # Assigns a default value for a specified field e.g. category='Vegetables', setting this value # either for all entries (overwrite_all), or only for those entries where the field was blank # in the spreadsheet (overwrite_empty), depending on selected import settings diff --git a/app/models/product_import/reset_absent.rb b/app/models/product_import/reset_absent.rb index 250369ba64..022e456ead 100644 --- a/app/models/product_import/reset_absent.rb +++ b/app/models/product_import/reset_absent.rb @@ -8,9 +8,7 @@ module ProductImport super(decorated) @products_reset_count = 0 - @settings = settings.settings - @updated_ids = settings.updated_ids - @enterprises_to_reset = settings.enterprises_to_reset + @settings = settings @suppliers_to_reset_products = [] @suppliers_to_reset_inventories = [] @@ -19,9 +17,9 @@ module ProductImport # For selected enterprises; set stock to zero for all products/inventory # that were not listed in the newly uploaded spreadsheet def call - return unless data_for_stock_reset? && reset_all_absent? + return unless settings.data_for_stock_reset? && settings.reset_all_absent? - enterprises_to_reset.each do |enterprise_id| + settings.enterprises_to_reset.each do |enterprise_id| next unless permission_by_id?(enterprise_id) if importing_into_inventory? @@ -37,7 +35,7 @@ module ProductImport 'variant_overrides.hub_id IN (?) ' \ 'AND variant_overrides.id NOT IN (?)', @suppliers_to_reset_inventories, - updated_ids + settings.updated_ids ) @products_reset_count += relation.update_all(count_on_hand: 0) end @@ -52,21 +50,13 @@ module ProductImport 'AND spree_variants.is_master = false ' \ 'AND spree_variants.deleted_at IS NULL', @suppliers_to_reset_products, - updated_ids + settings.updated_ids ) @products_reset_count += relation.update_all(count_on_hand: 0) end private - attr_reader :settings, :updated_ids, :enterprises_to_reset - - def data_for_stock_reset? - settings && updated_ids && enterprises_to_reset - end - - def reset_all_absent? - settings['reset_all_absent'] - end + attr_reader :settings end end diff --git a/app/models/product_import/settings.rb b/app/models/product_import/settings.rb index c0ef038ac1..4a0df965cb 100644 --- a/app/models/product_import/settings.rb +++ b/app/models/product_import/settings.rb @@ -21,5 +21,17 @@ module ProductImport def enterprises_to_reset @import_settings[:enterprises_to_reset] end + + def importing_into_inventory? + settings && settings['import_into'] == 'inventories' + end + + def reset_all_absent? + settings['reset_all_absent'] + end + + def data_for_stock_reset? + !!(settings && updated_ids && enterprises_to_reset) + end end end diff --git a/spec/models/product_import/entry_processor_spec.rb b/spec/models/product_import/entry_processor_spec.rb index 343a13f6d4..152012cf58 100644 --- a/spec/models/product_import/entry_processor_spec.rb +++ b/spec/models/product_import/entry_processor_spec.rb @@ -56,4 +56,19 @@ describe ProductImport::EntryProcessor do expect(reset_absent).to have_received(:products_reset_count) end end + + describe '#importing_into_inventory?' do + let(:settings) do + instance_double(ProductImport::Settings, importing_into_inventory?: true) + end + + before do + allow(ProductImport::Settings).to receive(:new) { settings } + end + + it 'delegates to Settings' do + entry_processor.importing_into_inventory? + expect(settings).to have_received(:importing_into_inventory?) + end + end end diff --git a/spec/models/product_import/reset_absent_spec.rb b/spec/models/product_import/reset_absent_spec.rb index b6ac542ba2..4551c217d3 100644 --- a/spec/models/product_import/reset_absent_spec.rb +++ b/spec/models/product_import/reset_absent_spec.rb @@ -24,29 +24,9 @@ describe ProductImport::ResetAbsent do let(:reset_absent) { described_class.new(entry_processor, settings) } describe '#call' do - context 'when there are no settings' do + context 'when there is no data' do let(:settings) do - instance_double( - ProductImport::Settings, - settings: nil, - updated_ids: [], - enterprises_to_reset: [] - ) - end - - it 'returns nil' do - expect(reset_absent.call).to be_nil - end - end - - context 'when there are no updated_ids' do - let(:settings) do - instance_double( - ProductImport::Settings, - settings: [], - updated_ids: nil, - enterprises_to_reset: [] - ) + instance_double(ProductImport::Settings, data_for_stock_reset?: false) end it 'returns nil' do @@ -58,9 +38,7 @@ describe ProductImport::ResetAbsent do let(:settings) do instance_double( ProductImport::Settings, - settings: [], - updated_ids: [], - enterprises_to_reset: nil + enterprises_to_reset: [] ) end @@ -69,11 +47,12 @@ describe ProductImport::ResetAbsent do end end - context 'when there are settings, updated_ids and enterprises_to_reset' do + context 'when there are updated_ids and enterprises_to_reset' do let(:settings) do instance_double( ProductImport::Settings, - settings: { 'reset_all_absent' => true }, + reset_all_absent?: true, + data_for_stock_reset?: true, updated_ids: [0], enterprises_to_reset: [enterprise.id.to_s] ) @@ -143,7 +122,8 @@ describe ProductImport::ResetAbsent do let(:settings) do instance_double( ProductImport::Settings, - settings: { 'reset_all_absent' => false }, + reset_all_absent?: false, + data_for_stock_reset?: true, updated_ids: [0], enterprises_to_reset: ['1'] ) @@ -171,7 +151,8 @@ describe ProductImport::ResetAbsent do let(:settings) do instance_double( ProductImport::Settings, - settings: { 'reset_all_absent' => true }, + reset_all_absent?: true, + data_for_stock_reset?: true, updated_ids: [0], enterprises_to_reset: ['1'] ) @@ -211,7 +192,8 @@ describe ProductImport::ResetAbsent do let(:settings) do instance_double( ProductImport::Settings, - settings: { 'reset_all_absent' => true }, + reset_all_absent?: true, + data_for_stock_reset?: true, updated_ids: [0], enterprises_to_reset: [enterprise_id.to_s] ) diff --git a/spec/models/product_import/settings_spec.rb b/spec/models/product_import/settings_spec.rb index 7673efe65b..a7f823b2d8 100644 --- a/spec/models/product_import/settings_spec.rb +++ b/spec/models/product_import/settings_spec.rb @@ -102,4 +102,129 @@ describe ProductImport::Settings do end end end + + describe '#importing_into_inventory?' do + context 'when :settings is specified' do + context 'and import_into is not specified' do + let(:import_settings) { { settings: {} } } + + it 'returns false' do + expect(settings.importing_into_inventory?).to eq(false) + end + end + + context 'and import_into is equal to inventories' do + let(:import_settings) do + { settings: { 'import_into' => 'inventories' } } + end + + it 'returns true' do + expect(settings.importing_into_inventory?).to eq(true) + end + end + + context 'and import_into is not equal to inventories' do + let(:import_settings) do + { settings: { 'import_into' => 'other' } } + end + + it 'returns false' do + expect(settings.importing_into_inventory?).to eq(false) + end + end + end + + context 'when :settings is not specified' do + let(:import_settings) { {} } + + it 'returns falsy' do + expect(settings.importing_into_inventory?).to be_falsy + end + end + end + + describe '#reset_all_absent?' do + context 'when :settings is not specified' do + let(:import_settings) { {} } + + it 'raises' do + expect { settings.reset_all_absent? }.to raise_error(NoMethodError) + end + end + + context 'when reset_all_absent is not set' do + let(:import_settings) do + { settings: {} } + end + + it 'returns nil' do + expect(settings.reset_all_absent?).to be_nil + end + end + + context 'when reset_all_absent is set' do + let(:import_settings) do + { settings: { 'reset_all_absent' => true } } + end + + it 'returns true' do + expect(settings.reset_all_absent?).to eq(true) + end + end + end + + describe '#data_for_stock_reset?' do + context 'when there are no settings' do + let(:import_settings) do + { + updated_ids: [], + enterprises_to_reset: [] + } + end + + it 'returns false' do + expect(settings.data_for_stock_reset?).to eq(false) + end + end + + context 'when there are no updated_ids' do + let(:import_settings) do + { + settings: [], + enterprises_to_reset: [] + } + end + + it 'returns false' do + expect(settings.data_for_stock_reset?).to eq(false) + end + end + + context 'when there are no enterprises_to_reset' do + let(:import_settings) do + { + settings: [], + updated_ids: [] + } + end + + it 'returns false' do + expect(settings.data_for_stock_reset?).to eq(false) + end + end + + context 'when there are settings, updated_ids and enterprises_to_reset' do + let(:import_settings) do + { + settings: { 'something' => true }, + updated_ids: [0], + enterprises_to_reset: [0] + } + end + + it 'returns true' do + expect(settings.data_for_stock_reset?).to eq(true) + end + end + end end