Stop storing unit_value and unit_description on master variant

This commit is contained in:
Matt-Yorkley
2023-05-21 19:35:26 +01:00
parent 8c0b8dad85
commit 6b9b5ea347
7 changed files with 31 additions and 27 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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'" }

View File

@@ -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)

View File

@@ -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

View File

@@ -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? }

View File

@@ -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("<p>A description...</p>")
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