diff --git a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee index 32e2b63912..ab5cb51249 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/edit.js.coffee @@ -3,6 +3,7 @@ angular.module('admin.orderCycles') $controller('AdminOrderCycleBasicCtrl', {$scope: $scope, ocInstance: ocInstance}) order_cycle_id = $location.absUrl().match(/\/admin\/order_cycles\/(\d+)/)[1] + $scope.order_cycle_id = order_cycle_id $scope.order_cycle = OrderCycle.load(order_cycle_id) $scope.enterprises = Enterprise.index(order_cycle_id: order_cycle_id) $scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: order_cycle_id) @@ -25,4 +26,4 @@ angular.module('admin.orderCycles') if $scope.order_cycle_form?.$dirty t('admin.unsaved_confirm_leave') - NavigationCheck.register(warnAboutUnsavedChanges) \ No newline at end of file + NavigationCheck.register(warnAboutUnsavedChanges) diff --git a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee index 112c6107bb..f108413372 100644 --- a/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/controllers/incoming_controller.js.coffee @@ -1,8 +1,9 @@ -angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $rootScope, $controller, $location, Enterprise, OrderCycle, ExchangeProduct, ocInstance) -> +angular.module('admin.orderCycles').controller 'AdminOrderCycleIncomingCtrl', ($scope, $rootScope, $controller, $location, Enterprise, EnterpriseFee, OrderCycle, ExchangeProduct, ocInstance) -> $controller('AdminOrderCycleExchangesCtrl', {$scope: $scope, ocInstance: ocInstance, $location: $location}) $scope.view = 'incoming' - + # NB: weirdly at this next line $scope.order_cycle.id comes out undefined so we use $scope.order_cycle_id instead + $scope.enterprise_fees = EnterpriseFee.index(order_cycle_id: $scope.order_cycle_id, per_item: true) $scope.exchangeTotalVariants = (exchange) -> return unless $scope.enterprises? && $scope.enterprises[exchange.enterprise_id]? diff --git a/app/assets/javascripts/admin/order_cycles/services/enterprise_fee.js.coffee b/app/assets/javascripts/admin/order_cycles/services/enterprise_fee.js.coffee index 5d8ebf6d59..c223b0d5a8 100644 --- a/app/assets/javascripts/admin/order_cycles/services/enterprise_fee.js.coffee +++ b/app/assets/javascripts/admin/order_cycles/services/enterprise_fee.js.coffee @@ -6,6 +6,8 @@ angular.module('admin.orderCycles').factory('EnterpriseFee', ($resource) -> params: order_cycle_id: '@order_cycle_id' coordinator_id: '@coordinator_id' + per_item: '@per_item' + per_order: '@per_order' }) { diff --git a/app/controllers/admin/enterprise_fees_controller.rb b/app/controllers/admin/enterprise_fees_controller.rb index ebe62dc10b..6b1dbcbbde 100644 --- a/app/controllers/admin/enterprise_fees_controller.rb +++ b/app/controllers/admin/enterprise_fees_controller.rb @@ -65,7 +65,9 @@ module Admin order_cycle ||= OrderCycle.new(coordinator:) if coordinator.present? enterprises = OpenFoodNetwork::OrderCyclePermissions.new(spree_current_user, order_cycle).visible_enterprises - EnterpriseFee.for_enterprises(enterprises).order('enterprise_id', 'fee_type', 'name') + + fees = EnterpriseFee.for_enterprises(enterprises).order('enterprise_id', 'fee_type', 'name') + filter_fees(fees) else collection = EnterpriseFee.managed_by(spree_current_user).order('enterprise_id', 'fee_type', 'name') @@ -74,6 +76,12 @@ module Admin end end + def filter_fees(fees) + fees = fees.per_item if params[:per_item] + fees = fees.per_order if params[:per_order] + fees + end + def collection_actions [:index, :for_order_cycle, :bulk_update] end diff --git a/spec/controllers/admin/enterprise_fees_controller_spec.rb b/spec/controllers/admin/enterprise_fees_controller_spec.rb new file mode 100644 index 0000000000..9205d808d7 --- /dev/null +++ b/spec/controllers/admin/enterprise_fees_controller_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: false + +require 'spec_helper' + +RSpec.describe Admin::EnterpriseFeesController do + before do + allow(controller).to receive_messages spree_current_user: super_admin + end + + describe "for_order_cycle" do + context "as super admin" do + let(:super_admin) { create(:admin_user) } + let!(:enterprise){ create(:distributor_enterprise_with_tax, name: 'Enterprise') } + let!(:fee1) { create(:enterprise_fee, :flat_rate, enterprise:) } + let!(:fee2) { create(:enterprise_fee, :per_item, enterprise:) } + let!(:fee3) { create(:enterprise_fee, :flat_rate, enterprise:) } + let!(:fee4) { create(:enterprise_fee, :per_item, enterprise:) } + let!(:order_cycle){ + create(:simple_order_cycle, name: "oc1", suppliers: [enterprise], + distributors: [enterprise]) + } + + it 'returns only per item enterprise fees of enterprise' do + get :for_order_cycle, format: :json, + params: { for_order_cycle: true, order_cycle_id: order_cycle.id, + per_item: true } + expect(assigns(:collection)).to include fee2, fee4 + end + it 'returns only per order enterprise fees of enterprise' do + get :for_order_cycle, format: :json, + params: { for_order_cycle: true, order_cycle_id: order_cycle.id, + per_order: true } + expect(assigns(:collection)).to include fee1, fee3 + end + it 'returns all enterprise fees of enterprise' do + get :for_order_cycle, format: :json, + params: { for_order_cycle: true, order_cycle_id: order_cycle.id } + expect(assigns(:collection)).to include fee1, fee2, fee3, fee4 + end + end + end +end diff --git a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee index 73deb77adc..6d7af8985f 100644 --- a/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/order_cycles/controllers/incoming_controller_spec.js.coffee @@ -17,6 +17,8 @@ describe 'AdminOrderCycleIncomingCtrl', -> preventDefault: jasmine.createSpy('preventDefault') OrderCycle = addSupplier: jasmine.createSpy('addSupplier') + EnterpriseFee = + index: jasmine.createSpy('index').and.returnValue('enterprise fees list') ocInstance = {} module('admin.orderCycles') diff --git a/spec/system/admin/order_cycles/simple_spec.rb b/spec/system/admin/order_cycles/simple_spec.rb index 841b4688a1..e5bbf0c86a 100644 --- a/spec/system/admin/order_cycles/simple_spec.rb +++ b/spec/system/admin/order_cycles/simple_spec.rb @@ -138,6 +138,38 @@ RSpec.describe ' let!(:distributor_managed_fee) { create(:enterprise_fee, enterprise: distributor_managed, name: 'Managed distributor fee') } + let!(:supplier_permitted_fee1) { + create(:enterprise_fee, :per_item, enterprise: supplier_permitted, + name: 'Supplier distributor fee1') + } + let!(:supplier_permitted_fee2) { + create(:enterprise_fee, :flat_rate, enterprise: supplier_permitted, + name: 'Supplier distributor fee2') + } + let!(:supplier_permitted_fee3) { + create(:enterprise_fee, :per_item, enterprise: supplier_permitted, + name: 'Supplier distributor fee3') + } + let!(:supplier_permitted_fee4) { + create(:enterprise_fee, :flat_rate, enterprise: supplier_permitted, + name: 'Supplier distributor fee4') + } + let!(:distributor_permitted_fee1) { + create(:enterprise_fee, :per_item, enterprise: distributor_permitted, + name: 'Distributor distributor fee1') + } + let!(:distributor_permitted_fee2) { + create(:enterprise_fee, :flat_rate, enterprise: distributor_permitted, + name: 'Distributor distributor fee2') + } + let!(:distributor_permitted_fee3) { + create(:enterprise_fee, :per_item, enterprise: distributor_permitted, + name: 'Distributor distributor fee3') + } + let!(:distributor_permitted_fee4) { + create(:enterprise_fee, :flat_rate, enterprise: distributor_permitted, + name: 'Distributor distributor fee4') + } let!(:shipping_method) { create(:shipping_method, distributors: [distributor_managed, distributor_unmanaged, distributor_permitted]) @@ -256,6 +288,17 @@ RSpec.describe ' click_button 'Add supplier' expect(page).to have_content "Permitted supplier" + within("tr.supplier-#{supplier_permitted.id}") { click_button 'Add fee' } + expect(page).to have_select( + "order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_id", minimum: 1 + ) + select "Permitted supplier", + from: "order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_id" + expect(page).to have_select( + "order_cycle_incoming_exchange_1_enterprise_fees_0_enterprise_fee_id", + options: ["", supplier_permitted_fee1.name, supplier_permitted_fee3.name] + ) + select_incoming_variant supplier_managed, 0, variant_managed select_incoming_variant supplier_permitted, 1, variant_permitted @@ -272,6 +315,18 @@ RSpec.describe ' click_button 'Add distributor' expect(page).to have_content "Permitted distributor" + within("tr.distributor-#{distributor_permitted.id}") { click_button 'Add fee' } + expect(page).to have_select( + "order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_id", minimum: 1 + ) + select "Permitted distributor", + from: "order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_id" + expect(page).to have_select( + "order_cycle_outgoing_exchange_1_enterprise_fees_0_enterprise_fee_id", + options: ["", distributor_permitted_fee1.name, distributor_permitted_fee2.name, + distributor_permitted_fee3.name, distributor_permitted_fee4.name] + ) + expect(page).to have_input 'order_cycle_outgoing_exchange_0_pickup_time' fill_in 'order_cycle_outgoing_exchange_0_pickup_time', with: 'pickup time' fill_in 'order_cycle_outgoing_exchange_0_pickup_instructions', with: 'pickup instructions'