From b7a08bcb9b98d5b2e235925fdd35f9f525c08054 Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Fri, 11 Jul 2014 12:48:12 +1000 Subject: [PATCH] Add Spree::Variant.in_order_cycle --- app/models/spree/variant_decorator.rb | 8 ++++++++ spec/models/spree/variant_spec.rb | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/app/models/spree/variant_decorator.rb b/app/models/spree/variant_decorator.rb index 69da9d5740..63ae5e0f3a 100644 --- a/app/models/spree/variant_decorator.rb +++ b/app/models/spree/variant_decorator.rb @@ -18,6 +18,7 @@ Spree::Variant.class_eval do before_validation :update_weight_from_unit_value after_save :update_units + scope :with_order_cycles_inner, joins(exchanges: :order_cycle) scope :with_order_cycles_outer, joins('LEFT OUTER JOIN exchange_variants AS o_exchange_variants ON (o_exchange_variants.variant_id = spree_variants.id)'). joins('LEFT OUTER JOIN exchanges AS o_exchanges ON (o_exchanges.id = o_exchange_variants.exchange_id)'). joins('LEFT OUTER JOIN order_cycles AS o_order_cycles ON (o_order_cycles.id = o_exchanges.order_cycle_id)') @@ -30,6 +31,13 @@ Spree::Variant.class_eval do select('DISTINCT spree_variants.*') } + scope :in_order_cycle, lambda { |order_cycle| + with_order_cycles_inner. + merge(Exchange.outgoing). + where('order_cycles.id = ?', order_cycle). + select('DISTINCT spree_variants.*') + } + def price_with_fees(distributor, order_cycle) price + fees_for(distributor, order_cycle) diff --git a/spec/models/spree/variant_spec.rb b/spec/models/spree/variant_spec.rb index e01c637616..5ddff963df 100644 --- a/spec/models/spree/variant_spec.rb +++ b/spec/models/spree/variant_spec.rb @@ -46,6 +46,27 @@ module Spree Variant.in_distributor(d1).should == [p1.master] end end + + describe "finding variants in an order cycle" do + let!(:d1) { create(:distributor_enterprise) } + let!(:d2) { create(:distributor_enterprise) } + let!(:p1) { create(:product) } + let!(:p2) { create(:product) } + let!(:oc1) { create(:simple_order_cycle, distributors: [d1], variants: [p1.master]) } + let!(:oc2) { create(:simple_order_cycle, distributors: [d2], variants: [p2.master]) } + + it "shows variants in an order cycle" do + Variant.in_order_cycle(oc1).should == [p1.master] + end + + it "doesn't show duplicates" do + ex = create(:exchange, order_cycle: oc1, sender: oc1.coordinator, receiver: d2) + ex.variants << p1.master + + Variant.in_order_cycle(oc1).should == [p1.master] + end + end + end describe "calculating the price with enterprise fees" do