From 8857404ddf762e2c13c367112987f3a57bd1dc9d Mon Sep 17 00:00:00 2001 From: luisramos0 Date: Thu, 17 Oct 2019 18:13:02 +0100 Subject: [PATCH] Remove product variants from all Order Cycles if supplier is changed --- app/models/spree/product_set.rb | 11 ++++++++++- spec/models/spree/product_set_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/app/models/spree/product_set.rb b/app/models/spree/product_set.rb index 4b78be91a0..bd825759a4 100644 --- a/app/models/spree/product_set.rb +++ b/app/models/spree/product_set.rb @@ -46,13 +46,15 @@ class Spree::ProductSet < ModelSet return true if product_related_attrs.blank? + original_supplier = product.supplier_id product.assign_attributes(product_related_attrs) product.variants.each do |variant| validate_presence_of_unit_value(product, variant) end - product.save if errors.empty? + + remove_product_from_order_cycles(product) if original_supplier != product.supplier_id end def validate_presence_of_unit_value(product, variant) @@ -62,6 +64,13 @@ class Spree::ProductSet < ModelSet product.errors.add(:unit_value, "can't be blank") end + def remove_product_from_order_cycles(product) + variant_ids = product.variants.map(&:id) + ExchangeVariant. + where(variant_id: variant_ids). + delete_all + end + def update_product_variants(product, attributes) return true unless attributes[:variants_attributes] update_variants_attributes(product, attributes[:variants_attributes]) diff --git a/spec/models/spree/product_set_spec.rb b/spec/models/spree/product_set_spec.rb index 3cf3a88975..af8d2ec64c 100644 --- a/spec/models/spree/product_set_spec.rb +++ b/spec/models/spree/product_set_spec.rb @@ -75,6 +75,31 @@ describe Spree::ProductSet do end end + context 'when a different supplier is passed' do + let!(:producer) { create(:enterprise) } + let!(:product) { create(:simple_product) } + let(:collection_hash) do + { + 0 => { + id: product.id, + supplier_id: producer.id + } + } + end + + let(:distributor) { create(:distributor_enterprise) } + let!(:order_cycle) { create(:simple_order_cycle, variants: [product.variants.first], coordinator: distributor, distributors: [distributor]) } + + it 'updates the product and removes the product from order cycles' do + product_set.save + + expect(product.reload.attributes).to include( + 'supplier_id' => producer.id + ) + expect(order_cycle.reload.distributed_variants).to_not include product.variants.first + end + end + context 'when :master_attributes is passed' do let!(:product) { create(:simple_product) } let(:collection_hash) { { 0 => { id: product.id } } }