diff --git a/app/controllers/spree/admin/payment_methods_controller_decorator.rb b/app/controllers/spree/admin/payment_methods_controller_decorator.rb
index 443e50a6d1..151a32e235 100644
--- a/app/controllers/spree/admin/payment_methods_controller_decorator.rb
+++ b/app/controllers/spree/admin/payment_methods_controller_decorator.rb
@@ -3,14 +3,18 @@ Spree::Admin::PaymentMethodsController.class_eval do
# ! Redundant code copied from Spree::Admin::ResourceController with modifications marked
def collection
return parent.send(controller_name) if parent_data.present?
- collection = if model_class.respond_to?(:accessible_by) && !current_ability.has_block?(params[:action], model_class)
+ collection = if model_class.respond_to?(:accessible_by) &&
+ !current_ability.has_block?(params[:action], model_class)
+
model_class.accessible_by(current_ability, action).
- managed_by(spree_current_user).by_distributor # this line added
+ managed_by(spree_current_user).by_distributor # This line added
+
else
model_class.scoped.
- managed_by(spree_current_user).by_distributor # this line added
+ managed_by(spree_current_user).by_distributor # This line added
end
+ # This block added
if params.key? :enterprise_id
distributor = Enterprise.find params[:enterprise_id]
collection = collection.for_distributor(distributor)
diff --git a/app/controllers/spree/admin/shipping_methods_controller_decorator.rb b/app/controllers/spree/admin/shipping_methods_controller_decorator.rb
index c90a256ff7..064e021da2 100644
--- a/app/controllers/spree/admin/shipping_methods_controller_decorator.rb
+++ b/app/controllers/spree/admin/shipping_methods_controller_decorator.rb
@@ -7,13 +7,25 @@ module Spree
# ! Code copied from Spree::Admin::ResourceController with two added lines
def collection
return parent.send(controller_name) if parent_data.present?
- if model_class.respond_to?(:accessible_by) && !current_ability.has_block?(params[:action], model_class)
- model_class.accessible_by(current_ability, action).
- by_distributor # this line added
- else
- model_class.scoped.
- by_distributor # this line added
+
+ collection = if model_class.respond_to?(:accessible_by) &&
+ !current_ability.has_block?(params[:action], model_class)
+
+ model_class.accessible_by(current_ability, action).
+ by_distributor # This line added
+
+ else
+ model_class.scoped.
+ by_distributor # This line added
+ end
+
+ # This block added
+ if params.key? :enterprise_id
+ distributor = Enterprise.find params[:enterprise_id]
+ collection = collection.for_distributor(distributor)
end
+
+ collection
end
# This method was originally written because ProductDistributions referenced shipping
diff --git a/app/models/spree/shipping_method_decorator.rb b/app/models/spree/shipping_method_decorator.rb
index dd8ec43c87..bbc774a42e 100644
--- a/app/models/spree/shipping_method_decorator.rb
+++ b/app/models/spree/shipping_method_decorator.rb
@@ -2,6 +2,11 @@ Spree::ShippingMethod.class_eval do
has_and_belongs_to_many :distributors, join_table: 'distributors_shipping_methods', :class_name => 'Enterprise', association_foreign_key: 'distributor_id'
attr_accessible :distributor_ids
+ scope :for_distributor, lambda { |distributor|
+ joins(:distributors).
+ where('enterprises.id = ?', distributor)
+ }
+
scope :by_distributor, lambda {
joins(:distributors).
order('enterprises.name, spree_shipping_methods.name').
diff --git a/app/views/admin/enterprises/index.html.erb b/app/views/admin/enterprises/index.html.erb
index 51c4fa803b..084ec06e8e 100644
--- a/app/views/admin/enterprises/index.html.erb
+++ b/app/views/admin/enterprises/index.html.erb
@@ -42,7 +42,7 @@
<%= link_to_delete_enterprise enterprise %>
<%= link_to_with_icon 'icon-chevron-right', 'Payment Methods', spree.admin_payment_methods_path(enterprise_id: enterprise.id) %> (<%= enterprise.payment_methods.count %>)
- <%= link_to_with_icon 'icon-plane', 'Shipping Methods', spree.admin_shipping_methods_path %> (<%= enterprise.shipping_methods.count %>)
+ <%= link_to_with_icon 'icon-plane', 'Shipping Methods', spree.admin_shipping_methods_path(enterprise_id: enterprise.id) %> (<%= enterprise.shipping_methods.count %>)
<%#= link_to_with_icon 'icon-money', 'Enterprise Fees', main_app.admin_enterprise_fees_path %>
diff --git a/spec/features/admin/shipping_methods_spec.rb b/spec/features/admin/shipping_methods_spec.rb
index 1cb4faa1ff..cab648e5af 100644
--- a/spec/features/admin/shipping_methods_spec.rb
+++ b/spec/features/admin/shipping_methods_spec.rb
@@ -83,5 +83,20 @@ feature 'shipping methods' do
shipping_method = Spree::ShippingMethod.find_by_name('Teleport')
shipping_method.distributors.should == [distributor1]
end
+
+ it "shows me only payment methods for the enterprise I select" do
+ sm1
+ sm2
+
+ click_link 'Enterprises'
+ within(".enterprise-#{distributor1.id}") { click_link 'Shipping Methods' }
+ page.should have_content sm1.name
+ page.should_not have_content sm2.name
+
+ click_link 'Enterprises'
+ within(".enterprise-#{distributor2.id}") { click_link 'Shipping Methods' }
+ page.should_not have_content sm1.name
+ page.should have_content sm2.name
+ end
end
end
diff --git a/spec/models/spree/shipping_method_spec.rb b/spec/models/spree/shipping_method_spec.rb
index 21b0f5e953..556ca037ce 100644
--- a/spec/models/spree/shipping_method_spec.rb
+++ b/spec/models/spree/shipping_method_spec.rb
@@ -18,6 +18,15 @@ module Spree
sm.reload.distributors.should == [d1, d2]
end
+ it "finds shipping methods for a particular distributor" do
+ d1 = create(:distributor_enterprise)
+ d2 = create(:distributor_enterprise)
+ sm1 = create(:shipping_method, distributors: [d1, d1])
+ sm2 = create(:shipping_method, distributors: [d2, d2])
+
+ ShippingMethod.for_distributor(d1).should == [sm1]
+ end
+
it "can order by distributor" do
d1 = create(:distributor_enterprise, name: '222')
d2 = create(:distributor_enterprise, name: '111')