diff --git a/app/assets/javascripts/admin/services/bulk_products.js.coffee b/app/assets/javascripts/admin/services/bulk_products.js.coffee index e8b8bb6c3d..a2823bf997 100644 --- a/app/assets/javascripts/admin/services/bulk_products.js.coffee +++ b/app/assets/javascripts/admin/services/bulk_products.js.coffee @@ -19,7 +19,7 @@ angular.module("ofn.admin").factory "BulkProducts", (ProductResource, dataFetche for server_product in serverProducts product = @findProductInList(server_product.id, @products) product.variants = server_product.variants - @loadVariantUnitValues product + @loadVariantUnitValues product.variants find: (id) -> @findProductInList id, @products @@ -38,34 +38,32 @@ angular.module("ofn.admin").factory "BulkProducts", (ProductResource, dataFetche @products.splice(index + 1, 0, newProduct) unpackProduct: (product) -> - #$scope.matchProducer product @loadVariantUnit product loadVariantUnit: (product) -> - product.variant_unit_with_scale = - if product.variant_unit && product.variant_unit_scale && product.variant_unit != 'items' - "#{product.variant_unit}_#{product.variant_unit_scale}" - else if product.variant_unit - product.variant_unit + @loadVariantUnitValues product.variants if product.variants + + loadVariantUnitValues: (variants) -> + for variant in variants + @loadVariantUnitValue variant + + loadVariantUnitValue: (variant) -> + variant.variant_unit_with_scale = + if variant.variant_unit && variant.variant_unit_scale && variant.variant_unit != 'items' + "#{variant.variant_unit}_#{variant.variant_unit_scale}" + else if variant.variant_unit + variant.variant_unit else null - @loadVariantUnitValues product if product.variants - @loadVariantUnitValue product, product.master if product.master - - loadVariantUnitValues: (product) -> - for variant in product.variants - @loadVariantUnitValue product, variant - - loadVariantUnitValue: (product, variant) -> - unit_value = @variantUnitValue product, variant + unit_value = @variantUnitValue variant unit_value = if unit_value? then unit_value else '' variant.unit_value_with_description = "#{unit_value} #{variant.unit_description || ''}".trim() - variantUnitValue: (product, variant) -> + variantUnitValue: (variant) -> if variant.unit_value? - if product.variant_unit_scale - variant_unit_value = @divideAsInteger variant.unit_value, product.variant_unit_scale + if variant.variant_unit_scale + variant_unit_value = @divideAsInteger variant.unit_value, variant.variant_unit_scale parseFloat(window.bigDecimal.round(variant_unit_value, 2)) else variant.unit_value diff --git a/spec/javascripts/unit/admin/services/bulk_products_spec.js.coffee b/spec/javascripts/unit/admin/services/bulk_products_spec.js.coffee index 466c09109f..ea741adc35 100644 --- a/spec/javascripts/unit/admin/services/bulk_products_spec.js.coffee +++ b/spec/javascripts/unit/admin/services/bulk_products_spec.js.coffee @@ -53,126 +53,128 @@ describe "BulkProducts service", -> describe "loading variant unit", -> describe "setting product variant_unit_with_scale field", -> - it "sets by combining variant_unit and variant_unit_scale", -> + it "HERE 2 sets by combining variant_unit and variant_unit_scale", -> product = - variant_unit: "volume" - variant_unit_scale: .001 + variants:[ + id: 10 + variant_unit: "volume" + variant_unit_scale: .001 + ] BulkProducts.loadVariantUnit product - expect(product.variant_unit_with_scale).toEqual "volume_0.001" + expect(product.variants[0].variant_unit_with_scale).toEqual "volume_0.001" it "sets to null when variant_unit is null", -> - product = {variant_unit: null, variant_unit_scale: 1000} + product = + variants: [ + {variant_unit: null, variant_unit_scale: 1000} + ] BulkProducts.loadVariantUnit product - expect(product.variant_unit_with_scale).toBeNull() + + expect(product.variants[0].variant_unit_with_scale).toBeNull() it "sets to variant_unit when variant_unit_scale is null", -> - product = {variant_unit: 'items', variant_unit_scale: null, variant_unit_name: 'foo'} + product = + variants: [ + {variant_unit: 'items', variant_unit_scale: null, variant_unit_name: 'foo'} + ] BulkProducts.loadVariantUnit product - expect(product.variant_unit_with_scale).toEqual "items" + expect(product.variants[0].variant_unit_with_scale).toEqual "items" it "sets to variant_unit when variant_unit is 'items'", -> - product = {variant_unit: 'items', variant_unit_scale: 1000, variant_unit_name: 'foo'} + product = + variants: [ + {variant_unit: 'items', variant_unit_scale: 1000, variant_unit_name: 'foo'} + ] BulkProducts.loadVariantUnit product - expect(product.variant_unit_with_scale).toEqual "items" - - it "loads data for variants (incl. master)", -> - spyOn BulkProducts, "loadVariantUnitValues" - spyOn BulkProducts, "loadVariantUnitValue" - - product = - variant_unit_scale: 1.0 - master: {id: 1, unit_value: 1, unit_description: '(one)'} - variants: [{id: 2, unit_value: 2, unit_description: '(two)'}] - BulkProducts.loadVariantUnit product - - expect(BulkProducts.loadVariantUnitValues).toHaveBeenCalledWith product - expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product, product.master + expect(product.variants[0].variant_unit_with_scale).toEqual "items" it "loads data for variants (excl. master)", -> spyOn BulkProducts, "loadVariantUnitValue" product = - variant_unit_scale: 1.0 - master: {id: 1, unit_value: 1, unit_description: '(one)'} - variants: [{id: 2, unit_value: 2, unit_description: '(two)'}] - BulkProducts.loadVariantUnitValues product + variants: [ + {id: 2, variant_unit_scale: 1.0, unit_value: 2, unit_description: '(two)'} + ] + BulkProducts.loadVariantUnitValues product.variants - expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product, product.variants[0] - expect(BulkProducts.loadVariantUnitValue).not.toHaveBeenCalledWith product, product.master + expect(BulkProducts.loadVariantUnitValue).toHaveBeenCalledWith product.variants[0] describe "setting variant unit_value_with_description", -> it "sets by combining unit_value and unit_description", -> product = - variant_unit_scale: 1.0 - variants: [{id: 1, unit_value: 1, unit_description: '(bottle)'}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + {id: 1, variant_unit_scale: 1.0, unit_value: 1, unit_description: '(bottle)'} + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0]).toEqual id: 1 + variant_unit_scale: 1.0, + variant_unit_with_scale: null, unit_value: 1 unit_description: '(bottle)' unit_value_with_description: '1 (bottle)' it "uses unit_value when description is missing", -> product = - variant_unit_scale: 1.0 - variants: [{id: 1, unit_value: 1}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + {id: 1, variant_unit_scale: 1.0, unit_value: 1} + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0].unit_value_with_description).toEqual '1' it "uses unit_description when value is missing", -> product = - variant_unit_scale: 1.0 - variants: [{id: 1, unit_description: 'Small'}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + {id: 1, variant_unit_scale: 1.0, unit_description: 'Small'} + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0].unit_value_with_description).toEqual 'Small' it "converts values from base value to chosen unit", -> product = - variant_unit_scale: 1000.0 - variants: [{id: 1, unit_value: 2500}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + id: 1, variant_unit_scale: 1000.0, unit_value: 2500 + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0].unit_value_with_description).toEqual '2.5' it "converts values from base value to chosen unit without breaking precision", -> product = - variant_unit_scale: 0.001 - variants: [{id: 1, unit_value: 0.35}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + {id: 1,variant_unit_scale: 0.001, unit_value: 0.35} + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0].unit_value_with_description).toEqual '350' it "displays a unit_value of zero", -> product = - variant_unit_scale: 1.0 - variants: [{id: 1, unit_value: 0}] - BulkProducts.loadVariantUnitValues product, product.variants[0] + variants: [ + {id: 1, variant_unit_scale: 1.0, unit_value: 0} + ] + BulkProducts.loadVariantUnitValues product.variants expect(product.variants[0].unit_value_with_description).toEqual '0' describe "calculating the scaled unit value for a variant", -> it "returns the scaled value when variant has a unit_value", -> - product = {variant_unit_scale: 0.001} - variant = {unit_value: 5} - expect(BulkProducts.variantUnitValue(product, variant)).toEqual 5000 + variant = {variant_unit_scale: 0.001, unit_value: 5} + expect(BulkProducts.variantUnitValue(variant)).toEqual 5000 it "returns the scaled value rounded off upto 2 decimal points", -> - product = {variant_unit_scale: 28.35} - variant = {unit_value: 1234.5} - expect(BulkProducts.variantUnitValue(product, variant)).toEqual 43.54 + variant = {variant_unit_scale: 28.35, unit_value: 1234.5} + expect(BulkProducts.variantUnitValue(variant)).toEqual 43.54 it "returns the unscaled value when the product has no scale", -> - product = {} variant = {unit_value: 5} - expect(BulkProducts.variantUnitValue(product, variant)).toEqual 5 + expect(BulkProducts.variantUnitValue(variant)).toEqual 5 it "returns zero when the value is zero", -> - product = {} variant = {unit_value: 0} - expect(BulkProducts.variantUnitValue(product, variant)).toEqual 0 + expect(BulkProducts.variantUnitValue(variant)).toEqual 0 it "returns null when the variant has no unit_value", -> - product = {} variant = {} - expect(BulkProducts.variantUnitValue(product, variant)).toEqual null + expect(BulkProducts.variantUnitValue(variant)).toEqual null describe "fetching a product by id", -> diff --git a/spec/system/admin/bulk_product_update_spec.rb b/spec/system/admin/bulk_product_update_spec.rb index e78b5e3505..704cc30407 100644 --- a/spec/system/admin/bulk_product_update_spec.rb +++ b/spec/system/admin/bulk_product_update_spec.rb @@ -72,19 +72,21 @@ RSpec.describe ' end it "displays a select box for the unit of measure for the product's variants" do - p = FactoryBot.create(:product, variant_unit: 'weight', variant_unit_scale: 1, - variant_unit_name: '') + create(:product, variant_unit: 'weight', variant_unit_scale: 1, + variant_unit_name: '') visit spree.admin_products_path + click_expand_all expect(page).to have_select "variant_unit_with_scale", selected: "Weight (g)" end it "displays a text field for the item name when unit is set to 'Items'" do - p = FactoryBot.create(:product, variant_unit: 'items', variant_unit_scale: nil, - variant_unit_name: 'packet') + create(:product, variant_unit: 'items', variant_unit_scale: nil, + variant_unit_name: 'packet') visit spree.admin_products_path + click_expand_all expect(page).to have_select "variant_unit_with_scale", selected: "Items" expect(page).to have_field "variant_unit_name", with: "packet" @@ -145,17 +147,15 @@ RSpec.describe ' end it "displays a unit value field (for each variant) for each product" do - p1 = FactoryBot.create(:product, price: 2.0, variant_unit: "weight", - variant_unit_scale: "1000") - v1 = FactoryBot.create(:variant, product: p1, price: 12.75, - unit_value: 1200, unit_description: "(small bag)", - display_as: "bag") - v2 = FactoryBot.create(:variant, product: p1, price: 2.50, - unit_value: 4800, unit_description: "(large bag)", - display_as: "bin") + p1 = create(:product, price: 2.0, variant_unit: "weight", variant_unit_scale: "1000") + v1 = create(:variant, product: p1, price: 12.75, unit_value: 1200, variant_unit_scale: "1000", + unit_description: "(small bag)", display_as: "bag") + v2 = create(:variant, product: p1, price: 2.50, unit_value: 4800, variant_unit_scale: "1000", + unit_description: "(large bag)", display_as: "bin") visit spree.admin_products_path expect(page).to have_selector "a.view-variants", count: 1 + all("a.view-variants").each(&:click) expect(page).to have_field "variant_unit_value_with_description", with: "1.2 (small bag)" @@ -220,7 +220,7 @@ RSpec.describe ' let!(:new_supplier) { create(:supplier_enterprise) } let!(:product) { create(:product, variant_unit: 'weight', variant_unit_scale: 1000, supplier_id: supplier.id) - } + } # Weight (kg) before do login_as_admin @@ -249,6 +249,7 @@ RSpec.describe ' # When I fill out variant details and hit update select new_supplier.name, from: 'producer_id' + tomselect_select "Weight (kg)", from: "variant_unit_with_scale" fill_in "variant_display_name", with: "Case of 12 Bottles" fill_in "variant_unit_value_with_description", with: "3 (12x250 mL bottles)" fill_in "variant_display_as", with: "Case" @@ -290,6 +291,7 @@ RSpec.describe ' within "tr#v_-1" do select supplier.name, from: 'producer_id' + tomselect_select "Weight (kg)", from: "variant_unit_with_scale" fill_in "variant_unit_value_with_description", with: "120" fill_in "variant_price", with: "6.66" end @@ -304,6 +306,7 @@ RSpec.describe ' end within "tr#v_-1" do + tomselect_select "Weight (g)", from: "variant_unit_with_scale" fill_in "variant_unit_value_with_description", with: "120g" fill_in "variant_price", with: "6.66" fill_in "variant_on_hand", with: "222" @@ -322,6 +325,7 @@ RSpec.describe ' end within "tr#v_-1" do + tomselect_select "Weight (g)", from: "variant_unit_with_scale" fill_in "variant_unit_value_with_description", with: "120g" fill_in "variant_price", with: "6.66" check "variant_on_demand" @@ -335,12 +339,13 @@ RSpec.describe ' end it "updating product attributes" do - s1 = FactoryBot.create(:supplier_enterprise) - s2 = FactoryBot.create(:supplier_enterprise) - t1 = FactoryBot.create(:taxon) - t2 = FactoryBot.create(:taxon) - p = FactoryBot.create(:product, supplier_id: s1.id, variant_unit: 'volume', - variant_unit_scale: 1, primary_taxon: t2, sku: "OLD SKU") + s1 = create(:supplier_enterprise) + create(:supplier_enterprise) + create(:taxon) + t2 = create(:taxon) + p = create(:product, supplier_id: s1.id, variant_unit: 'volume', variant_unit_scale: 1, + primary_taxon: t2, sku: "OLD SKU") + variant = p.variants.first login_as_admin visit spree.admin_products_path @@ -348,34 +353,43 @@ RSpec.describe ' toggle_columns /^Category?/i, "Inherits Properties?", "SKU" within "tr#p_#{p.id}" do + page.find('a.view-variants').click + expect(page).to have_field "product_name", with: p.name - expect(page).to have_select "variant_unit_with_scale", selected: "Volume (L)" expect(page).to have_checked_field "inherits_properties" expect(page).to have_field "product_sku", with: p.sku fill_in "product_name", with: "Big Bag Of Potatoes" - select "Weight (kg)", from: "variant_unit_with_scale" uncheck "inherits_properties" fill_in "product_sku", with: "NEW SKU" end + within "tr#v_#{variant.id}" do + expect(page).to have_select "variant_unit_with_scale", selected: "Volume (L)" + + tomselect_select "Weight (kg)", from: "variant_unit_with_scale" + end click_button 'Save Changes', match: :first expect(page.find("#status-message")).to have_content "Changes saved." p.reload expect(p.name).to eq "Big Bag Of Potatoes" - expect(p.variant_unit).to eq "weight" - expect(p.variant_unit_scale).to eq 1000 # Kg expect(p.inherits_properties).to be false expect(p.sku).to eq "NEW SKU" + + variant.reload + expect(variant.variant_unit).to eq "weight" + expect(variant.variant_unit_scale).to eq 1000 # Kg end it "updating a product with a variant unit of 'items'" do - p = FactoryBot.create(:product, variant_unit: 'weight', variant_unit_scale: 1000) + p = create(:product, variant_unit: 'weight', variant_unit_scale: 1000) login_as_admin visit spree.admin_products_path + page.find('a.view-variants').click + expect(page).to have_select "variant_unit_with_scale", selected: "Weight (kg)" select "Items", from: "variant_unit_with_scale" @@ -384,10 +398,10 @@ RSpec.describe ' click_button 'Save Changes', match: :first expect(page.find("#status-message")).to have_content "Changes saved." - p.reload - expect(p.variant_unit).to eq "items" - expect(p.variant_unit_scale).to be_nil - expect(p.variant_unit_name).to eq "loaf" + variant = p.variants.first + expect(variant.variant_unit).to eq "items" + expect(variant.variant_unit_scale).to be_nil + expect(variant.variant_unit_name).to eq "loaf" end it "updating a product with variants" do @@ -853,14 +867,15 @@ RSpec.describe ' expect(page).to have_field "product_name", with: p.name fill_in "product_name", with: "Big Bag Of Potatoes" - select "Weight (kg)", from: "variant_unit_with_scale" find("a.view-variants").click end within "#v_#{v.id}" do expect(page).to have_select "producer_id", selected: supplier_permitted.name + select supplier_managed2.name, from: 'producer_id' + select "Weight (kg)", from: "variant_unit_with_scale" fill_in "variant_price", with: "20" fill_in "variant_on_hand", with: "18" fill_in "variant_display_as", with: "Big Bag" @@ -872,8 +887,8 @@ RSpec.describe ' p.reload v.reload expect(p.name).to eq "Big Bag Of Potatoes" - expect(p.variant_unit).to eq "weight" - expect(p.variant_unit_scale).to eq 1000 # Kg + expect(v.variant_unit).to eq "weight" + expect(v.variant_unit_scale).to eq 1000 # Kg expect(v.supplier).to eq supplier_managed2 expect(v.display_as).to eq "Big Bag" expect(v.price).to eq 20.0