Improve performance in various reports

This commit is contained in:
Matt-Yorkley
2020-06-04 12:02:11 +02:00
parent 12000d2d44
commit 9e278d5b2f
3 changed files with 41 additions and 2 deletions

View File

@@ -247,8 +247,10 @@ module Spree
end
def suppliers_of_products_distributed_by(distributors)
distributors.map { |d| Spree::Product.in_distributor(d).includes(:supplier).all }.
flatten.map(&:supplier).uniq
supplier_ids = Spree::Product.in_distributors(distributors).
select('spree_products.supplier_id')
Enterprise.where(id: supplier_ids)
end
# Load order cycles the current user has access to

View File

@@ -84,6 +84,12 @@ Spree::Product.class_eval do
select('distinct spree_products.*')
}
scope :in_distributors, lambda { |distributors|
with_order_cycles_outer.
where('(o_exchanges.incoming = ? AND o_exchanges.receiver_id IN (?))', false, distributors).
uniq
}
# Products supplied by a given enterprise or distributed via that enterprise through an OC
scope :in_supplier_or_distributor, lambda { |enterprise|
enterprise = enterprise.respond_to?(:id) ? enterprise.id : enterprise.to_i

View File

@@ -257,6 +257,37 @@ module Spree
end
end
describe "in_distributors" do
let!(:distributor1) { create(:distributor_enterprise) }
let!(:distributor2) { create(:distributor_enterprise) }
let!(:product1) { create(:product) }
let!(:product2) { create(:product) }
let!(:product3) { create(:product) }
let!(:product4) { create(:product) }
let!(:order_cycle1) {
create(:order_cycle, distributors: [distributor1],
variants: [product1.variants.first, product2.variants.first])
}
let!(:order_cycle2) {
create(:order_cycle, distributors: [distributor2],
variants: [product3.variants.first])
}
it "returns distributed products for a given Enterprise AR relation" do
distributors_relation = Enterprise.where(id: [distributor1.id, distributor2.id])
expect(Product.in_distributors(distributors_relation)).to include product1, product2, product3
expect(Product.in_distributors(distributors_relation)).to_not include product4
end
it "returns distributed products for a given array of enterprise ids" do
distributors_ids = [distributor1.id, distributor2.id]
expect(Product.in_distributors(distributors_ids)).to include product1, product2, product3
expect(Product.in_distributors(distributors_ids)).to_not include product4
end
end
describe "in_supplier_or_distributor" do
it "shows products in supplier" do
s1 = create(:supplier_enterprise)