Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Product Refactor] Move variant unit sizes to variant #12787

Open
wants to merge 68 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
0ec9796
Add variant_unit_scale, variant_unit_name to variant
rioug Jun 18, 2024
8b5eda3
Fix weigths and measures
rioug Jun 18, 2024
6a94135
Fix option value namer
rioug Jun 18, 2024
ceb13f7
Move variant unit attributes to variant 1
rioug Jun 26, 2024
24184c2
Move variant unit attributes to variant 2
rioug Jun 26, 2024
e4eaf54
Migrate unit sizes to variant
rioug Aug 19, 2024
1b78c99
Fix Spree::LineItem
rioug Jun 30, 2024
ec20a42
Refactor, use instance_double in variant spec
rioug Jun 30, 2024
09c4df6
Fix Unit Price service
rioug Jul 1, 2024
2e070e7
Fix product importer
rioug Jul 2, 2024
ae57236
Refactor ProductImport::EntryValidator
rioug Jul 2, 2024
d1788c1
Fix product set spec
rioug Jul 2, 2024
6f7d4e5
Fix variant controller spec
rioug Jul 2, 2024
a60df32
Fix API v0 products controller spec
rioug Jul 2, 2024
c3e470f
Fix spree admin products controller spec
rioug Jul 2, 2024
76b21ff
Fix API v0 variants controller spec
rioug Jul 2, 2024
48e8dbb
Fix UnitPrice spec
rioug Jul 2, 2024
d534b28
Fix DFC supplied product builder
rioug Jul 3, 2024
2925f70
Fix angular option value namer
rioug Jul 8, 2024
6482f1c
Consolidate angular option value namer spec
rioug Jul 8, 2024
b4f963f
Fix product and variant api serializer
rioug Jul 8, 2024
5d780f5
Fix legacy bulk edit products UI
rioug Jul 8, 2024
35e124f
Update jest configuration to include webpacker dir
rioug Jul 10, 2024
5b1ab46
Fix Bulk products edit page , part 1
rioug Jul 12, 2024
4336ce8
Fix Bulk Edit product part 2
rioug Jul 12, 2024
91430c1
Prettify javascript
rioug Jul 15, 2024
230b07d
Add PriceParser and UnitPrices and specs
rioug Jul 16, 2024
51b1ccd
Add localizeCurrency and specs
rioug Jul 23, 2024
685a8bb
Add systemOfMeasurement to VariantUnitManager
rioug Jul 23, 2024
ec1e950
Update variant form and rip out angular
rioug Jul 24, 2024
f0c068f
Backport fix for hungarian instance
rioug Jul 29, 2024
323ac61
Use unit_value_with_description
rioug Jul 29, 2024
ed17f42
Fix ProductDuplicator
rioug Jul 29, 2024
9729e8b
Use `instance_double` instead of `double`
rioug Jul 29, 2024
7d81721
Fix rebase typo
rioug Jul 31, 2024
f9089c4
Fix rebase issue
rioug Jul 31, 2024
b2d91c8
Add missing translations for variant form
rioug Aug 6, 2024
ba6eeb9
Fix Bulk product edit system spec after rebase
rioug Aug 6, 2024
45e1d61
Update Spree::Price parsing to match LocalizedNumber.parse
rioug Aug 6, 2024
bd4c50d
Add toggleOnHand action
rioug Aug 6, 2024
3f70e4b
Fix variant system spec
rioug Aug 7, 2024
596a77e
Fix product system spec
rioug Aug 7, 2024
7a152f5
Fix legacy bulk edit product system spec
rioug Aug 12, 2024
d562b97
Post rebase fix product import system spec
rioug Aug 12, 2024
e45cb88
Fix Unit price system spec
rioug Aug 12, 2024
095ea00
Fix minor differences in local env and CI
rioug Aug 12, 2024
caf86b3
Fix orders and fulfillment report
rioug Aug 12, 2024
7f23d4b
Fix bulk order management page
rioug Aug 13, 2024
2e5a3eb
Fix product import controller
rioug Aug 13, 2024
0959202
Fix small bug on edit variant page
rioug Aug 13, 2024
5e56c1d
Move unit popout css to a partial
rioug Aug 14, 2024
9cf4889
Add stying for the unit pop out
rioug Aug 14, 2024
b6a7a5f
Improve variant related validation when creating product
rioug Aug 19, 2024
cfd8e74
Fix rebase issue
rioug Aug 19, 2024
b36fdf8
Add all columns moved to variant to `ignored_columns`
rioug Aug 19, 2024
98cd1b1
Fix bulk coop report
rioug Aug 21, 2024
cd077fb
Remove non updatable check when updating a product
rioug Aug 26, 2024
7fcbf04
Update spec/models/spree/variant_spec.rb
rioug Aug 26, 2024
fcad8ac
Remove commented out code
rioug Aug 26, 2024
22e7300
Per review, remove the use of `raw`
rioug Aug 26, 2024
3a31d76
Per review, check value are saved in the database
rioug Aug 26, 2024
32e02dd
Fix spec to remove reliance on browser's message
rioug Aug 27, 2024
ac7aa09
Re add test for invalid cloned products
rioug Aug 27, 2024
25c8f87
Update spec/system/admin/products_v3/update_spec.rb
rioug Aug 27, 2024
2618b4e
Fix rebase issue
rioug Sep 3, 2024
27dfac7
Use AdminTooltipComponent, instead of partial
rioug Sep 23, 2024
ee4f775
Fix invoice print specs
rioug Sep 23, 2024
00b7f24
Post rebase, fix product cloning spec
rioug Sep 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
*.yaml
*.json
*.html
**/*.rb

# JS
# Enabled: app/webpacker/controllers/*.js and app/webpacker/packs/*.js
Expand All @@ -27,6 +28,5 @@ postcss.config.js
/coverage/
/engines/
/public/
/spec/
/tmp/
/vendor/
50 changes: 23 additions & 27 deletions app/assets/javascripts/admin/bulk_product_update.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -187,9 +187,8 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
product.variants.length > 0


$scope.hasUnit = (product) ->
product.variant_unit_with_scale?

$scope.hasUnit = (variant) ->
variant.variant_unit_with_scale?

$scope.variantSaved = (variant) ->
variant.hasOwnProperty('id') && variant.id > 0
Expand Down Expand Up @@ -242,32 +241,28 @@ angular.module("ofn.admin").controller "AdminProductEditCtrl", ($scope, $timeout
$window.location = destination

$scope.packProduct = (product) ->
dacook marked this conversation as resolved.
Show resolved Hide resolved
if product.variant_unit_with_scale
match = product.variant_unit_with_scale.match(/^([^_]+)_([\d\.]+)$/)
if match
product.variant_unit = match[1]
product.variant_unit_scale = parseFloat(match[2])
else
product.variant_unit = product.variant_unit_with_scale
product.variant_unit_scale = null
else
product.variant_unit = product.variant_unit_scale = null


if product.variants
for id, variant of product.variants
$scope.packVariant product, variant
$scope.packVariant variant


$scope.packVariant = (variant) ->
if variant.variant_unit_with_scale
match = variant.variant_unit_with_scale.match(/^([^_]+)_([\d\.]+)$/)
if match
variant.variant_unit = match[1]
variant.variant_unit_scale = parseFloat(match[2])
else
variant.variant_unit = variant.variant_unit_with_scale
variant.variant_unit_scale = null

$scope.packVariant = (product, variant) ->
if variant.hasOwnProperty("unit_value_with_description")
match = variant.unit_value_with_description.match(/^([\d\.\,]+(?= |$)|)( |)(.*)$/)
if match
product = BulkProducts.find product.id
variant.unit_value = parseFloat(match[1].replace(",", "."))
variant.unit_value = null if isNaN(variant.unit_value)
if variant.unit_value && product.variant_unit_scale
variant.unit_value = parseFloat(window.bigDecimal.multiply(variant.unit_value, product.variant_unit_scale, 2))
if variant.unit_value && variant.variant_unit_scale
variant.unit_value = parseFloat(window.bigDecimal.multiply(variant.unit_value, variant.variant_unit_scale, 2))
variant.unit_description = match[3]

$scope.incrementLimit = ->
Expand Down Expand Up @@ -321,13 +316,6 @@ filterSubmitProducts = (productsToFilter) ->
if product.hasOwnProperty("price")
filteredProduct.price = product.price
hasUpdatableProperty = true
if product.hasOwnProperty("variant_unit_with_scale")
filteredProduct.variant_unit = product.variant_unit
filteredProduct.variant_unit_scale = product.variant_unit_scale
hasUpdatableProperty = true
if product.hasOwnProperty("variant_unit_name")
filteredProduct.variant_unit_name = product.variant_unit_name
hasUpdatableProperty = true
if product.hasOwnProperty("on_hand") and filteredVariants.length == 0 #only update if no variants present
filteredProduct.on_hand = product.on_hand
hasUpdatableProperty = true
Expand Down Expand Up @@ -383,6 +371,14 @@ filterSubmitVariant = (variant) ->
if variant.hasOwnProperty("producer_id")
filteredVariant.supplier_id = variant.producer_id
hasUpdatableProperty = true
if variant.hasOwnProperty("variant_unit_with_scale")
filteredVariant.variant_unit = variant.variant_unit
filteredVariant.variant_unit_scale = variant.variant_unit_scale
hasUpdatableProperty = true
if variant.hasOwnProperty("variant_unit_name")
filteredVariant.variant_unit_name = variant.variant_unit_name
hasUpdatableProperty = true

{filteredVariant: filteredVariant, hasUpdatableProperty: hasUpdatableProperty}


Expand Down
21 changes: 10 additions & 11 deletions app/assets/javascripts/admin/directives/display_as.js.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,30 @@ angular.module("ofn.admin").directive "ofnDisplayAs", (OptionValueNamer) ->
scope.$watchCollection ->
return [
scope.$eval(attrs.ofnDisplayAs).unit_value_with_description
scope.product.variant_unit_name
scope.product.variant_unit_with_scale
scope.variant.variant_unit_name
scope.variant.variant_unit_with_scale
]
, ->
[variant_unit, variant_unit_scale] = productUnitProperties()
[unit_value, unit_description] = variantUnitProperties(variant_unit_scale)
variant_object =
variant_object =
unit_value: unit_value
unit_description: unit_description
product:
variant_unit_scale: variant_unit_scale
variant_unit: variant_unit
variant_unit_name: scope.product.variant_unit_name
variant_unit_scale: variant_unit_scale
variant_unit: variant_unit
variant_unit_name: scope.variant.variant_unit_name

scope.placeholder_text = new OptionValueNamer(variant_object).name()

productUnitProperties = ->
# get relevant product properties
if scope.product.variant_unit_with_scale?
match = scope.product.variant_unit_with_scale.match(/^([^_]+)_([\d\.]+)$/)
if scope.variant.variant_unit_with_scale?
match = scope.variant.variant_unit_with_scale.match(/^([^_]+)_([\d\.]+)$/)
if match
variant_unit = match[1]
variant_unit_scale = parseFloat(match[2])
else
variant_unit = scope.product.variant_unit_with_scale
variant_unit = scope.variant.variant_unit_with_scale
variant_unit_scale = null
else
variant_unit = variant_unit_scale = null
Expand All @@ -45,4 +44,4 @@ angular.module("ofn.admin").directive "ofnDisplayAs", (OptionValueNamer) ->
unit_value = null if isNaN(unit_value)
unit_value *= variant_unit_scale if unit_value && variant_unit_scale
unit_description = match[3]
[unit_value, unit_description]
[unit_value, unit_description]

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -199,22 +199,22 @@ 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))
, 0

$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))
Expand All @@ -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
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
# Controller for "New Products" form (spree/admin/products/new)
angular.module("admin.products")
.controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, PriceParser) ->
$scope.product = { master: {} }
$scope.product.master.product = $scope.product
$scope.product = {}
$scope.placeholder_text = ""

$scope.$watchCollection '[product.variant_unit_with_scale, product.master.unit_value_with_description, product.price, product.variant_unit_name]', ->
$scope.$watchCollection '[product.variant_unit_with_scale, product.unit_value_with_description, product.price, product.variant_unit_name]', ->
$scope.processVariantUnitWithScale()
$scope.processUnitValueWithDescription()
$scope.processUnitPrice()
$scope.placeholder_text = new OptionValueNamer($scope.product.master).name() if $scope.product.variant_unit_scale
$scope.placeholder_text = new OptionValueNamer($scope.product).name() if $scope.product.variant_unit_scale

$scope.variant_unit_options = VariantUnitManager.variantUnitOptions()

Expand Down Expand Up @@ -38,24 +37,24 @@ angular.module("admin.products")
# Extract unit_value and unit_description from text field unit_value_with_description,
# and update hidden variant fields
$scope.processUnitValueWithDescription = ->
if $scope.product.master.hasOwnProperty("unit_value_with_description")
match = $scope.product.master.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/)
if $scope.product.hasOwnProperty("unit_value_with_description")
match = $scope.product.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/)
if match
$scope.product.master.unit_value = PriceParser.parse(match[1])
$scope.product.master.unit_value = null if isNaN($scope.product.master.unit_value)
$scope.product.master.unit_value = window.bigDecimal.multiply($scope.product.master.unit_value, $scope.product.variant_unit_scale, 2) if $scope.product.master.unit_value && $scope.product.variant_unit_scale
$scope.product.master.unit_description = match[3]
$scope.product.unit_value = PriceParser.parse(match[1])
$scope.product.unit_value = null if isNaN($scope.product.unit_value)
$scope.product.unit_value = window.bigDecimal.multiply($scope.product.unit_value, $scope.product.variant_unit_scale, 2) if $scope.product.unit_value && $scope.product.variant_unit_scale
$scope.product.unit_description = match[3]
else
value = $scope.product.master.unit_value
value = window.bigDecimal.divide(value, $scope.product.variant_unit_scale, 2) if $scope.product.master.unit_value && $scope.product.variant_unit_scale
$scope.product.master.unit_value_with_description = value + " " + $scope.product.master.unit_description
value = $scope.product.unit_value
value = window.bigDecimal.divide(value, $scope.product.variant_unit_scale, 2) if $scope.product.unit_value && $scope.product.variant_unit_scale
$scope.product.unit_value_with_description = value + " " + $scope.product.unit_description

# Calculate unit price based on product price and variant_unit_scale
$scope.processUnitPrice = ->
price = $scope.product.price
scale = $scope.product.variant_unit_scale
unit_type = $scope.product.variant_unit
unit_value = $scope.product.master.unit_value
unit_value = $scope.product.unit_value
variant_unit_name = $scope.product.variant_unit_name
$scope.unit_price = UnitPrices.displayableUnitPrice(price, scale, unit_type, unit_value, variant_unit_name)

Expand Down

This file was deleted.

This file was deleted.

Loading
Loading