diff --git a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee index 88479620fa..d10de21f26 100644 --- a/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee +++ b/app/assets/javascripts/admin/line_items/controllers/line_items_controller.js.coffee @@ -199,14 +199,14 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.refreshData() $scope.getLineItemScale = (lineItem) -> - if lineItem.units_product && lineItem.units_variant && (lineItem.units_product.variant_unit == "weight" || lineItem.units_product.variant_unit == "volume") - lineItem.units_product.variant_unit_scale + if lineItem.units_variant && lineItem.units_variant.variant_unit_scale && (lineItem.units_variant.variant_unit == "weight" || lineItem.units_variant.variant_unit == "volume") + lineItem.units_variant.variant_unit_scale else 1 $scope.sumUnitValues = -> sum = $scope.filteredLineItems?.reduce (sum, lineItem) -> - if lineItem.units_product.variant_unit == "items" + if lineItem.units_variant.variant_unit == "items" sum + lineItem.quantity else sum + $scope.roundToThreeDecimals(lineItem.final_weight_volume / $scope.getLineItemScale(lineItem)) @@ -214,7 +214,7 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, $scope.sumMaxUnitValues = -> sum = $scope.filteredLineItems?.reduce (sum,lineItem) -> - if lineItem.units_product.variant_unit == "items" + if lineItem.units_variant.variant_unit == "items" sum + lineItem.max_quantity else sum + lineItem.max_quantity * $scope.roundToThreeDecimals(lineItem.units_variant.unit_value / $scope.getLineItemScale(lineItem)) @@ -228,39 +228,41 @@ angular.module("admin.lineItems").controller 'LineItemsCtrl', ($scope, $timeout, return false if !lineItem.hasOwnProperty('final_weight_volume') || !(lineItem.final_weight_volume > 0) true - $scope.getScale = (unitsProduct, unitsVariant) -> - if unitsProduct.hasOwnProperty("variant_unit") && (unitsProduct.variant_unit == "weight" || unitsProduct.variant_unit == "volume") - unitsProduct.variant_unit_scale - else if unitsProduct.hasOwnProperty("variant_unit") && unitsProduct.variant_unit == "items" + $scope.getScale = (unitsVariant) -> + if unitsVariant.hasOwnProperty("variant_unit") && (unitsVariant.variant_unit == "weight" || unitsVariant.variant_unit == "volume") + unitsVariant.variant_unit_scale + else if unitsVariant.hasOwnProperty("variant_unit") && unitsVariant.variant_unit == "items" 1 else null - $scope.getFormattedValueWithUnitName = (value, unitsProduct, unitsVariant, scale) -> - unit_name = VariantUnitManager.getUnitName(scale, unitsProduct.variant_unit) + $scope.getFormattedValueWithUnitName = (value, unitsVariant, scale) -> + unit_name = VariantUnitManager.getUnitName(scale, unitsVariant.variant_unit) $scope.roundToThreeDecimals(value) + " " + unit_name - $scope.getGroupBySizeFormattedValueWithUnitName = (value, unitsProduct, unitsVariant) -> - scale = $scope.getScale(unitsProduct, unitsVariant) + $scope.getGroupBySizeFormattedValueWithUnitName = (value, unitsVariant) -> + scale = $scope.getScale(unitsVariant) if scale && value value = value / scale if scale != 28.35 && scale != 1 && scale != 453.6 # divide by scale if not smallest unit - $scope.getFormattedValueWithUnitName(value, unitsProduct, unitsVariant, scale) + $scope.getFormattedValueWithUnitName(value, unitsVariant, scale) else '' - $scope.formattedValueWithUnitName = (value, unitsProduct, unitsVariant) -> - scale = $scope.getScale(unitsProduct, unitsVariant) + $scope.formattedValueWithUnitName = (value, unitsVariant) -> + scale = $scope.getScale(unitsVariant) if scale - $scope.getFormattedValueWithUnitName(value, unitsProduct, unitsVariant, scale) + $scope.getFormattedValueWithUnitName(value, unitsVariant, scale) else '' $scope.fulfilled = (sumOfUnitValues) -> # A Units Variant is an API object which holds unit properies of a variant - if $scope.selectedUnitsProduct.hasOwnProperty("group_buy_unit_size")&& $scope.selectedUnitsProduct.group_buy_unit_size > 0 && - $scope.selectedUnitsProduct.hasOwnProperty("variant_unit") - if $scope.selectedUnitsProduct.variant_unit == "weight" || $scope.selectedUnitsProduct.variant_unit == "volume" - scale = $scope.selectedUnitsProduct.variant_unit_scale + if $scope.selectedUnitsProduct.hasOwnProperty("group_buy_unit_size") && $scope.selectedUnitsProduct.group_buy_unit_size > 0 && + $scope.selectedUnitsVariant.hasOwnProperty("variant_unit") + + if $scope.selectedUnitsVariant.variant_unit == "weight" || $scope.selectedUnitsVariant.variant_unit == "volume" + + scale = $scope.selectedUnitsVariant.variant_unit_scale sumOfUnitValues = sumOfUnitValues * scale unless scale == 28.35 || scale == 453.6 $scope.roundToThreeDecimals(sumOfUnitValues / $scope.selectedUnitsProduct.group_buy_unit_size) else diff --git a/app/serializers/api/admin/units_product_serializer.rb b/app/serializers/api/admin/units_product_serializer.rb index 60c5f70b97..4d6e83a8fd 100644 --- a/app/serializers/api/admin/units_product_serializer.rb +++ b/app/serializers/api/admin/units_product_serializer.rb @@ -3,7 +3,7 @@ module Api module Admin class UnitsProductSerializer < ActiveModel::Serializer - attributes :id, :name, :group_buy_unit_size, :variant_unit, :variant_unit_scale + attributes :id, :name, :group_buy_unit_size end end end diff --git a/app/serializers/api/admin/units_variant_serializer.rb b/app/serializers/api/admin/units_variant_serializer.rb index 99423957ff..6557767aff 100644 --- a/app/serializers/api/admin/units_variant_serializer.rb +++ b/app/serializers/api/admin/units_variant_serializer.rb @@ -3,7 +3,7 @@ module Api module Admin class UnitsVariantSerializer < ActiveModel::Serializer - attributes :id, :full_name, :unit_value + attributes :id, :full_name, :unit_value, :variant_unit, :variant_unit_scale def full_name full_name = object.full_name diff --git a/app/views/spree/admin/orders/bulk_management.html.haml b/app/views/spree/admin/orders/bulk_management.html.haml index 6f27875d8d..f4b57f832f 100644 --- a/app/views/spree/admin/orders/bulk_management.html.haml +++ b/app/views/spree/admin/orders/bulk_management.html.haml @@ -80,15 +80,15 @@ .three.columns .text-center = t("admin.orders.bulk_management.group_buy_unit_size") - .text-center {{ getGroupBySizeFormattedValueWithUnitName(selectedUnitsProduct.group_buy_unit_size , selectedUnitsProduct, selectedUnitsVariant ) }} + .text-center {{ getGroupBySizeFormattedValueWithUnitName(selectedUnitsProduct.group_buy_unit_size , selectedUnitsVariant ) }} .three.columns .text-center = t("admin.orders.bulk_management.total_qtt_ordered") - .text-center {{ formattedValueWithUnitName( sumUnitValues(), selectedUnitsProduct, selectedUnitsVariant ) }} + .text-center {{ formattedValueWithUnitName( sumUnitValues(), selectedUnitsVariant ) }} .three.columns .text-center = t("admin.orders.bulk_management.max_qtt_ordered") - .text-center {{ formattedValueWithUnitName( sumMaxUnitValues(), selectedUnitsProduct, selectedUnitsVariant ) }} + .text-center {{ formattedValueWithUnitName( sumMaxUnitValues(), selectedUnitsVariant ) }} .three.columns .text-center = t("admin.orders.bulk_management.current_fulfilled_units") diff --git a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee index e77ee3780e..39797ccc6b 100644 --- a/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee +++ b/spec/javascripts/unit/admin/line_items/controllers/line_items_controller_spec.js.coffee @@ -213,35 +213,67 @@ describe "LineItemsCtrl", -> expect(scope.fulfilled()).toEqual '' it "returns '' if selectedUnitsVariant has no property 'group_buy_unit_size' or group_buy_unit_size is 0", -> - scope.selectedUnitsProduct = { variant_unit: "weight", group_buy_unit_size: 0 } + scope.selectedUnitsProduct = { group_buy_unit_size: 0 } + scope.selectedUnitsVariant = { variant_unit: "weight" } expect(scope.fulfilled()).toEqual '' - scope.selectedUnitsProduct = { variant_unit: "weight" } + scope.selectedUnitsProduct = { } + scope.selectedUnitsVariant = { variant_unit: "weight" } expect(scope.fulfilled()).toEqual '' it "calls Math.round() if variant_unit is 'weight', 'volume', or items", -> spyOn(Math,"round") - scope.selectedUnitsProduct = { variant_unit: "weight", group_buy_unit_size: 10 } + scope.selectedUnitsProduct = { group_buy_unit_size: 10 } + scope.selectedUnitsVariant = { variant_unit: "weight" } + scope.fulfilled() expect(Math.round).toHaveBeenCalled() - scope.selectedUnitsProduct = { variant_unit: "volume", group_buy_unit_size: 10 } + + scope.selectedUnitsProduct = { group_buy_unit_size: 10 } + scope.selectedUnitsVariant = { variant_unit: "volume" } + scope.fulfilled() expect(Math.round).toHaveBeenCalled() - scope.selectedUnitsProduct = { variant_unit: "items", group_buy_unit_size: 10 } + + scope.selectedUnitsProduct = { group_buy_unit_size: 10 } + scope.selectedUnitsVariant = { variant_unit: "items" } + scope.fulfilled() expect(Math.round).toHaveBeenCalled() - describe "returns the quantity of fulfilled group buy units", -> + describe "returns the quantity of fulfilled group buy units", -> runs = [ - { selectedUnitsProduct: { variant_unit: "weight", group_buy_unit_size: 1000, variant_unit_scale: 1 }, arg: 1500, expected: 1.5 }, - { selectedUnitsProduct: { variant_unit: "weight", group_buy_unit_size: 60000, variant_unit_scale: 1000 }, arg: 9, expected: 0.15 }, - { selectedUnitsProduct: { variant_unit: "weight", group_buy_unit_size: 60000, variant_unit_scale: 1 }, arg: 9000, expected: 0.15 } - { selectedUnitsProduct: { variant_unit: "weight", group_buy_unit_size: 5, variant_unit_scale: 28.35 }, arg: 12, expected: 2.4}, - { selectedUnitsProduct: { variant_unit: "volume", group_buy_unit_size: 5000, variant_unit_scale: 1 }, arg: 5, expected: 0.001} - ]; - runs.forEach ({selectedUnitsProduct, arg, expected}) -> - it "returns the quantity of fulfilled group buy units, group_buy_unit_size: " + selectedUnitsProduct.group_buy_unit_size + ", arg: " + arg + ", scale: " + selectedUnitsProduct.variant_unit_scale , -> + { + selectedUnitsProduct: { group_buy_unit_size: 1000 }, + selectedUnitsVariant: { variant_unit: "weight", variant_unit_scale: 1 }, + arg: 1500, + expected: 1.5 + }, { + selectedUnitsProduct: { group_buy_unit_size: 60000 } , + selectedUnitsVariant: { variant_unit: "weight", variant_unit_scale: 1000 } , + arg: 9, + expected: 0.15 + }, { + selectedUnitsProduct: { group_buy_unit_size: 60000 }, + selectedUnitsVariant: { variant_unit: "weight", variant_unit_scale: 1 }, + arg: 9000, + expected: 0.15 + }, { + selectedUnitsProduct: { group_buy_unit_size: 5 }, + selectedUnitsVariant: { variant_unit: "weight", variant_unit_scale: 28.35 }, + arg: 12, + expected: 2.4 + }, { + selectedUnitsProduct: { group_buy_unit_size: 5000 }, + selectedUnitsVariant: { variant_unit: "volume", variant_unit_scale: 1 }, + arg: 5, + expected: 0.001 + } + ] + runs.forEach ({selectedUnitsProduct, selectedUnitsVariant, arg, expected}) -> + it "returns the quantity of fulfilled group buy units, group_buy_unit_size: " + selectedUnitsProduct.group_buy_unit_size + ", arg: " + arg + ", scale: " + selectedUnitsVariant.variant_unit_scale , -> scope.selectedUnitsProduct = selectedUnitsProduct + scope.selectedUnitsVariant = selectedUnitsVariant expect(scope.fulfilled(arg)).toEqual expected describe "allFinalWeightVolumesPresent()", -> @@ -278,44 +310,44 @@ describe "LineItemsCtrl", -> describe "sumUnitValues()", -> it "returns the sum of the final_weight_volumes line_items if volume", -> scope.filteredLineItems = [ - { final_weight_volume: 2, units_product: { variant_unit: "volume" } } - { final_weight_volume: 7, units_product: { variant_unit: "volume" } } - { final_weight_volume: 21, units_product: { variant_unit: "volume" } } + { final_weight_volume: 2, units_variant: { variant_unit: "volume" } } + { final_weight_volume: 7, units_variant: { variant_unit: "volume" } } + { final_weight_volume: 21, units_variant: { variant_unit: "volume" } } ] expect(scope.sumUnitValues()).toEqual 30 it "returns the sum of the quantity line_items if items", -> scope.filteredLineItems = [ - { quantity: 2, units_product: { variant_unit: "items" } } - { quantity: 7, units_product: { variant_unit: "items" } } - { quantity: 21, units_product: { variant_unit: "items" } } + { quantity: 2, units_variant: { variant_unit: "items" } } + { quantity: 7, units_variant: { variant_unit: "items" } } + { quantity: 21, units_variant: { variant_unit: "items" } } ] expect(scope.sumUnitValues()).toEqual 30 it "returns the sum of the final_weight_volumes for line_items with both metric and imperial units", -> scope.filteredLineItems = [ - { final_weight_volume: 907.2, units_product: { variant_unit: "weight", variant_unit_scale: 453.6 }, units_variant: { unit_value: 453.6 } } - { final_weight_volume: 2000, units_product: { variant_unit: "weight", variant_unit_scale: 1000 }, units_variant: { unit_value: 1000 } } - { final_weight_volume: 56.7, units_product: { variant_unit: "weight", variant_unit_scale: 28.35 }, units_variant: { unit_value: 28.35 } } - { final_weight_volume: 2, units_product: { variant_unit: "volume", variant_unit_scale: 1.0 }, units_variant: { unit_value: 1.0 } } + { final_weight_volume: 907.2, units_variant: { variant_unit: "weight", variant_unit_scale: 453.6, unit_value: 453.6 } } + { final_weight_volume: 2000, units_variant: { variant_unit: "weight", variant_unit_scale: 1000, unit_value: 1000 } } + { final_weight_volume: 56.7, units_variant: { variant_unit: "weight", variant_unit_scale: 28.35, unit_value: 28.35 } } + { final_weight_volume: 2, units_variant: { variant_unit: "volume", variant_unit_scale: 1.0, unit_value: 1.0 } } ] expect(scope.sumUnitValues()).toEqual 8 describe "sumMaxUnitValues()", -> it "returns the sum of the product of unit_value and maxOf(max_quantity, pristine quantity) for specified line_items", -> scope.filteredLineItems = [ - { id: 1, units_variant: { unit_value: 1 }, max_quantity: 5, units_product: { variant_unit: "volume", variant_unit_scale: 1 } } - { id: 2, units_variant: { unit_value: 2 }, max_quantity: 1, units_product: { variant_unit: "volume", variant_unit_scale: 1 } } - { id: 3, units_variant: { unit_value: 3 }, max_quantity: 10, units_product: { variant_unit: "volume", variant_unit_scale: 1 } } + { id: 1, units_variant: { variant_unit: "volume", variant_unit_scale: 1, unit_value: 1 }, max_quantity: 5 } + { id: 2, units_variant: { variant_unit: "volume", variant_unit_scale: 1, unit_value: 2 }, max_quantity: 1 } + { id: 3, units_variant: { variant_unit: "volume", variant_unit_scale: 1, unit_value: 3 }, max_quantity: 10 } ] expect(scope.sumMaxUnitValues()).toEqual 37 it "returns the sum of the product of max_quantity for specified line_items if variant_unit is `items`", -> scope.filteredLineItems = [ - { id: 1, units_variant: { unit_value: 1 }, max_quantity: 5, units_product: { variant_unit: "items" } } - { id: 2, units_variant: { unit_value: 2 }, max_quantity: 1, units_product: { variant_unit: "items" } } - { id: 3, units_variant: { unit_value: 3 }, max_quantity: 10, units_product: { variant_unit: "items" } } + { id: 1, units_variant: { variant_unit: "items", unit_value: 1 }, max_quantity: 5 } + { id: 2, units_variant: { variant_unit: "items", unit_value: 2 }, max_quantity: 1 } + { id: 3, units_variant: { variant_unit: "items", unit_value: 3 }, max_quantity: 10 } ] expect(scope.sumMaxUnitValues()).toEqual 16 @@ -331,45 +363,45 @@ describe "LineItemsCtrl", -> expect(scope.formattedValueWithUnitName(1,{})).toEqual '' it "returns the value, and does not call Math.round if variant_unit is 'items'", -> - unitsProduct = { variant_unit: "items" } - expect(scope.formattedValueWithUnitName(1, unitsProduct, unitsVariant)).toEqual "1 items" + unitsVariant.variant_unit= "items" + expect(scope.formattedValueWithUnitName(1, unitsVariant)).toEqual "1 items" it "calls Math.round() if variant_unit is 'weight' or 'volume'", -> - unitsProduct = { variant_unit: "weight", variant_unit_scale: 1 } - scope.formattedValueWithUnitName(1,unitsProduct,unitsVariant) + unitsVariant = { unit_value: "1", variant_unit: "weight", variant_unit_scale: 1 } + scope.formattedValueWithUnitName(1, unitsVariant) expect(Math.round).toHaveBeenCalled() - scope.selectedUnitsVariant = { variant_unit: "volume" } - scope.formattedValueWithUnitName(1,unitsProduct,unitsVariant) + + scope.selectedUnitsVariant = {unit_value: "1", variant_unit: "volume" } + scope.formattedValueWithUnitName(1, unitsVariant) expect(Math.round).toHaveBeenCalled() it "calls Math.round with the value multiplied by 1000", -> - unitsProduct = { variant_unit: "weight", variant_unit_scale: 5 } - scope.formattedValueWithUnitName(10, unitsProduct,unitsVariant) + unitsVariant = { unit_value: 1, variant_unit: "weight", variant_unit_scale: 5 } + scope.formattedValueWithUnitName(10, unitsVariant) expect(Math.round).toHaveBeenCalledWith 10 * 1000 it "returns the result of Math.round divided by 1000, followed by the result of getUnitName", -> - unitsProduct = { variant_unit: "weight", variant_unit_scale: 1000 } + unitsVariant = { unit_value: 1, variant_unit: "weight", variant_unit_scale: 1000 } spyOn(VariantUnitManager, "getUnitName").and.returnValue "kg" - expect(scope.formattedValueWithUnitName(2,unitsProduct,unitsVariant)).toEqual "2 kg" + expect(scope.formattedValueWithUnitName(2, unitsVariant)).toEqual "2 kg" it "handle correclty the imperial units", -> - unitsProduct = { variant_unit: "weight", variant_unit_scale: 1000 } - unitsVariant = { unit_value: "453.6" } + unitsVariant = { variant_unit: "weight", variant_unit_scale: 1000, unit_value: "453.6" } spyOn(VariantUnitManager, "getUnitName").and.returnValue "lb" - expect(scope.formattedValueWithUnitName(2, unitsProduct, unitsVariant)).toEqual "2 lb" + expect(scope.formattedValueWithUnitName(2, unitsVariant)).toEqual "2 lb" describe "get group by size formatted value with unit name", -> beforeEach -> spyOn(VariantUnitManager, "getUnitName").and.returnValue "kg" - - unitsProduct = { variant_unit: "weight", variant_unit_scale: 1000 } - + + unitsVariant = { variant_unit: "weight", variant_unit_scale: 1000 } + it "returns the formatted value with unit name", -> - expect(scope.getGroupBySizeFormattedValueWithUnitName(1000, unitsProduct)).toEqual "1 kg" + expect(scope.getGroupBySizeFormattedValueWithUnitName(1000, unitsVariant)).toEqual "1 kg" it "handle the case when the value is actually null or empty", -> - expect(scope.getGroupBySizeFormattedValueWithUnitName(null, unitsProduct)).toEqual "" - expect(scope.getGroupBySizeFormattedValueWithUnitName("", unitsProduct)).toEqual "" + expect(scope.getGroupBySizeFormattedValueWithUnitName(null, unitsVariant)).toEqual "" + expect(scope.getGroupBySizeFormattedValueWithUnitName("", unitsVariant)).toEqual "" describe "updating the price upon updating the weight of a line item", ->