diff --git a/app/models/spree/product.rb b/app/models/spree/product.rb index 51c52d451f..ee5cbd199e 100755 --- a/app/models/spree/product.rb +++ b/app/models/spree/product.rb @@ -75,12 +75,12 @@ module Spree ) } - delegate_belongs_to :master, :images, :sku, :unit_value, :unit_description + delegate_belongs_to :master, :images, :sku delegate :images_attributes=, to: :master # Transient attributes used temporarily when creating a new product, # these values are persisted on the product's variant - attr_accessor :price, :display_as + attr_accessor :price, :display_as, :unit_value, :unit_description after_create :set_master_variant_defaults after_save :save_master @@ -100,7 +100,8 @@ module Spree if: proc { Spree::Config[:products_require_tax_category] } validates :variant_unit, presence: true - validates :unit_value, presence: { if: ->(p) { %w(weight volume).include? p.variant_unit } } + validates :unit_value, presence: + { if: ->(p) { %w(weight volume).include?(p.variant_unit) && new_record? } } validates :variant_unit_scale, presence: { if: ->(p) { %w(weight volume).include? p.variant_unit } } validates :variant_unit_name, @@ -396,6 +397,8 @@ module Spree variant.is_master = false variant.price = price variant.display_as = display_as + variant.unit_value = unit_value + variant.unit_description = unit_description variants << variant end diff --git a/app/models/spree/variant.rb b/app/models/spree/variant.rb index 739680634f..38d68b17a0 100644 --- a/app/models/spree/variant.rb +++ b/app/models/spree/variant.rb @@ -59,13 +59,13 @@ module Spree if: proc { !is_master } validates :unit_value, presence: true, if: ->(variant) { - %w(weight volume).include?(variant.product&.variant_unit) + %w(weight volume).include?(variant.product&.variant_unit) && !variant.is_master } - validates :unit_value, numericality: { greater_than: 0 } + validates :unit_value, numericality: { greater_than: 0 }, if: proc { !is_master } validates :unit_description, presence: true, if: ->(variant) { - variant.product&.variant_unit.present? && variant.unit_value.nil? + variant.product&.variant_unit.present? && variant.unit_value.nil? && !variant.is_master } before_validation :set_cost_currency diff --git a/app/views/spree/admin/products/new.html.haml b/app/views/spree/admin/products/new.html.haml index 28a2bbbd8a..b167c07998 100644 --- a/app/views/spree/admin/products/new.html.haml +++ b/app/views/spree/admin/products/new.html.haml @@ -35,8 +35,8 @@ = f.label :unit_value, t(".value"), 'ng-disabled' => "!hasUnit(product)" %span.required * %input.fullwidth{ id: 'product_unit_value', 'ng-model' => 'product.master.unit_value_with_description', :type => 'text', placeholder: "eg. 2", 'ng-disabled' => "!hasUnit(product)" } - %input{ type: 'hidden', 'ng-value': 'product.master.unit_value', "ng-init": "product.master.unit_value='#{@product.master.unit_value}'", name: 'product[unit_value]' } - %input{ type: 'hidden', 'ng-value': 'product.master.unit_description', "ng-init": "product.master.unit_description='#{@product.master.unit_description}'", name: 'product[unit_description]' } + %input{ type: 'hidden', 'ng-value': 'product.master.unit_value', "ng-init": "product.master.unit_value='#{@product.unit_value}'", name: 'product[unit_value]' } + %input{ type: 'hidden', 'ng-value': 'product.master.unit_description', "ng-init": "product.master.unit_description='#{@product.unit_description}'", name: 'product[unit_description]' } = f.error_message_on :unit_value = render 'display_as', f: f .six.columns.omega{ 'ng-show' => "product.variant_unit_with_scale == 'items'" } diff --git a/spec/lib/spree/core/product_duplicator_spec.rb b/spec/lib/spree/core/product_duplicator_spec.rb index 1d4bc777af..97649d7973 100644 --- a/spec/lib/spree/core/product_duplicator_spec.rb +++ b/spec/lib/spree/core/product_duplicator_spec.rb @@ -85,6 +85,7 @@ describe Spree::Core::ProductDuplicator do expect(new_product).to receive(:taxons=).with([]) expect(new_product).to receive(:product_properties=).with([new_property]) expect(new_product).to receive(:created_at=).with(nil) + expect(new_product).to receive(:unit_value=).with(true) expect(new_product).to receive(:updated_at=).with(nil) expect(new_product).to receive(:deleted_at=).with(nil) expect(new_product).to receive(:master=).with(new_master_variant) diff --git a/spec/models/product_importer_spec.rb b/spec/models/product_importer_spec.rb index 87eff08c04..b59b179cf5 100644 --- a/spec/models/product_importer_spec.rb +++ b/spec/models/product_importer_spec.rb @@ -151,51 +151,51 @@ describe ProductImport::ProductImporter do carrots = Spree::Product.find_by(name: 'Carrots') expect(carrots.supplier).to eq enterprise expect(carrots.on_hand).to eq 5 - expect(carrots.price).to eq 3.20 - expect(carrots.unit_value).to eq 500 + expect(carrots.variants.first.price).to eq 3.20 + expect(carrots.variants.first.unit_value).to eq 500 expect(carrots.variant_unit).to eq 'weight' expect(carrots.variant_unit_scale).to eq 1 - expect(carrots.on_demand).to_not eq true + expect(carrots.variants.first.on_demand).to_not eq true expect(carrots.variants.first.import_date).to be_within(1.minute).of Time.zone.now potatoes = Spree::Product.find_by(name: 'Potatoes') expect(potatoes.supplier).to eq enterprise expect(potatoes.on_hand).to eq 6 - expect(potatoes.price).to eq 6.50 - expect(potatoes.unit_value).to eq 2000 + expect(potatoes.variants.first.price).to eq 6.50 + expect(potatoes.variants.first.unit_value).to eq 2000 expect(potatoes.variant_unit).to eq 'weight' expect(potatoes.variant_unit_scale).to eq 1000 - expect(potatoes.on_demand).to_not eq true + expect(potatoes.variants.first.on_demand).to_not eq true expect(potatoes.variants.first.import_date).to be_within(1.minute).of Time.zone.now pea_soup = Spree::Product.find_by(name: 'Pea Soup') expect(pea_soup.supplier).to eq enterprise expect(pea_soup.on_hand).to eq 8 - expect(pea_soup.price).to eq 5.50 - expect(pea_soup.unit_value).to eq 0.75 + expect(pea_soup.variants.first.price).to eq 5.50 + expect(pea_soup.variants.first.unit_value).to eq 0.75 expect(pea_soup.variant_unit).to eq 'volume' expect(pea_soup.variant_unit_scale).to eq 0.001 - expect(pea_soup.on_demand).to_not eq true + expect(pea_soup.variants.first.on_demand).to_not eq true expect(pea_soup.variants.first.import_date).to be_within(1.minute).of Time.zone.now salad = Spree::Product.find_by(name: 'Salad') expect(salad.supplier).to eq enterprise expect(salad.on_hand).to eq 7 - expect(salad.price).to eq 4.50 - expect(salad.unit_value).to eq 1 + expect(salad.variants.first.price).to eq 4.50 + expect(salad.variants.first.unit_value).to eq 1 expect(salad.variant_unit).to eq 'items' expect(salad.variant_unit_scale).to eq nil - expect(salad.on_demand).to_not eq true + expect(salad.variants.first.on_demand).to_not eq true expect(salad.variants.first.import_date).to be_within(1.minute).of Time.zone.now buns = Spree::Product.find_by(name: 'Hot Cross Buns') expect(buns.supplier).to eq enterprise expect(buns.on_hand).to eq 7 - expect(buns.price).to eq 3.50 - expect(buns.unit_value).to eq 1 + expect(buns.variants.first.price).to eq 3.50 + expect(buns.variants.first.unit_value).to eq 1 expect(buns.variant_unit).to eq 'items' expect(buns.variant_unit_scale).to eq nil - expect(buns.on_demand).to eq true + expect(buns.variants.first.on_demand).to eq true expect(buns.variants.first.import_date).to be_within(1.minute).of Time.zone.now end end diff --git a/spec/system/admin/product_import_spec.rb b/spec/system/admin/product_import_spec.rb index c2834fc7ee..3242a24c3b 100644 --- a/spec/system/admin/product_import_spec.rb +++ b/spec/system/admin/product_import_spec.rb @@ -94,7 +94,7 @@ describe "Product Import" do potatoes = Spree::Product.find_by(name: 'Potatoes') expect(potatoes.supplier).to eq enterprise expect(potatoes.on_hand).to eq 6 - expect(potatoes.price).to eq 6.50 + expect(potatoes.variants.first.price).to eq 6.50 expect(potatoes.variants.first.import_date).to be_within(1.minute).of Time.zone.now wait_until { page.find("a.button.view").present? } diff --git a/spec/system/admin/products_spec.rb b/spec/system/admin/products_spec.rb index 12fe2810b4..738a43c351 100644 --- a/spec/system/admin/products_spec.rb +++ b/spec/system/admin/products_spec.rb @@ -103,8 +103,8 @@ describe ' expect(product.supplier).to eq(@supplier) expect(product.variant_unit).to eq('weight') expect(product.variant_unit_scale).to eq(1000) - expect(product.unit_value).to eq(5000) - expect(product.unit_description).to eq("") + expect(product.variants.first.unit_value).to eq(5000) + expect(product.variants.first.unit_description).to eq("") expect(product.variant_unit_name).to eq("") expect(product.primary_taxon_id).to eq(taxon.id) expect(product.variants.first.price.to_s).to eq('19.99') @@ -113,7 +113,7 @@ describe ' expect(product.shipping_category).to eq(shipping_category) expect(product.description).to eq("

A description...

") expect(product.group_buy).to be_falsey - expect(product.master.unit_presentation).to eq("5kg") + expect(product.variants.first.unit_presentation).to eq("5kg") end it "creating an on-demand product" do