Move unlocalize_currency filter to a PriceParser service

- It's no longer a filter but more a service: it's therefore more logic.
This commit is contained in:
Jean-Baptiste Bellet
2021-06-11 10:01:19 +02:00
parent 6cf0c73453
commit 178c0a441b
6 changed files with 69 additions and 70 deletions

View File

@@ -1,5 +1,5 @@
angular.module("admin.products")
.controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, unlocalizeCurrencyFilter) ->
.controller "unitsCtrl", ($scope, VariantUnitManager, OptionValueNamer, UnitPrices, PriceParser) ->
$scope.product = { master: {} }
$scope.product.master.product = $scope.product
$scope.placeholder_text = ""
@@ -28,7 +28,7 @@ angular.module("admin.products")
if $scope.product.master.hasOwnProperty("unit_value_with_description")
match = $scope.product.master.unit_value_with_description.match(/^([\d\.,]+(?= *|$)|)( *)(.*)$/)
if match
$scope.product.master.unit_value = unlocalizeCurrencyFilter(match[1])
$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 *= $scope.product.variant_unit_scale if $scope.product.master.unit_value && $scope.product.variant_unit_scale
$scope.product.master.unit_description = match[3]

View File

@@ -1,4 +1,4 @@
angular.module("admin.products").controller "variantUnitsCtrl", ($scope, VariantUnitManager, $timeout, UnitPrices, unlocalizeCurrencyFilter) ->
angular.module("admin.products").controller "variantUnitsCtrl", ($scope, VariantUnitManager, $timeout, UnitPrices, PriceParser) ->
$scope.unitName = (scale, type) ->
VariantUnitManager.getUnitName(scale, type)
@@ -23,7 +23,7 @@ angular.module("admin.products").controller "variantUnitsCtrl", ($scope, Variant
$scope.updateValue = ->
unit_value_human = angular.element('#unit_value_human').val()
$scope.unit_value = unlocalizeCurrencyFilter(unit_value_human) * $scope.scale
$scope.unit_value = PriceParser.parse(unit_value_human) * $scope.scale
variant_unit_value = angular.element('#variant_unit_value').val()
$scope.unit_value_human = variant_unit_value / $scope.scale

View File

@@ -1,7 +1,7 @@
angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter, unlocalizeCurrencyFilter) ->
angular.module("admin.products").factory "UnitPrices", (VariantUnitManager, localizeCurrencyFilter, PriceParser) ->
class UnitPrices
@displayableUnitPrice: (price, scale, unit_type, unit_value, variant_unit_name) ->
price = unlocalizeCurrencyFilter(price)
price = PriceParser.parse(price)
if price && !isNaN(price) && unit_type && unit_value
value = localizeCurrencyFilter(UnitPrices.price(price, scale, unit_type, unit_value, variant_unit_name))
unit = UnitPrices.unit(scale, unit_type, variant_unit_name)

View File

@@ -1,26 +0,0 @@
angular.module("admin.utils").filter "unlocalizeCurrency", ()->
# Convert string to number using injected currency configuration.
(price) ->
if (!price)
return null
# used decimal and thousands separators from currency configuration
decimal_separator = I18n.toCurrency(.1, {precision: 1, unit: ''}).substring(1,2)
thousands_separator = I18n.toCurrency(1000, {precision: 1, unit: ''}).substring(1,2)
# Replace comma used as a decimal separator and remplace by "."
if (price.match(/^[0-9]*(,{1})[0-9]{1,2}$/g))
price = price.replace(",", ".")
# Remove configured thousands separator if it is actually a thousands separator
if (new RegExp("^([0-9]*(" + thousands_separator + "{1})[0-9]{3}[0-9\.,]*)*$", "g").test(price))
price = price.replaceAll(thousands_separator, '')
if (decimal_separator == ",")
price = price.replace(",", ".")
price = parseFloat(price)
if (isNaN(price))
return null
return price

View File

@@ -0,0 +1,24 @@
angular.module("admin.utils").factory "PriceParser", ->
new class PriceParser
parse: (price) =>
return null unless price
# used decimal and thousands separators from currency configuration
decimal_separator = I18n.toCurrency(.1, {precision: 1, unit: ''}).substring(1,2)
thousands_separator = I18n.toCurrency(1000, {precision: 1, unit: ''}).substring(1,2)
# Replace comma used as a decimal separator and remplace by "."
if (price.match(/^[0-9]*(,{1})[0-9]{1,2}$/g))
price = price.replace(",", ".")
# Remove configured thousands separator if it is actually a thousands separator
if (new RegExp("^([0-9]*(" + thousands_separator + "{1})[0-9]{3}[0-9\.,]*)*$", "g").test(price))
price = price.replaceAll(thousands_separator, '')
if (decimal_separator == ",")
price = price.replace(",", ".")
price = parseFloat(price)
return null if isNaN(price)
return price

View File

@@ -1,10 +1,10 @@
describe 'convert string to number with configurated currency', ->
filter = null
describe "PriceParser service", ->
priceParser = null
beforeEach ->
module 'ofn.admin'
inject ($filter) ->
filter = $filter('unlocalizeCurrency')
module('admin.utils')
inject (PriceParser) ->
priceParser = PriceParser
describe "with point as decimal separator and comma as thousands separator for I18n service", ->
@@ -16,34 +16,34 @@ describe 'convert string to number with configurated currency', ->
return "1,000"
it "handle point as decimal separator", ->
expect(filter("1.00")).toEqual 1.0
expect(priceParser.parse("1.00")).toEqual 1.0
it "handle point as decimal separator", ->
expect(filter("1.000")).toEqual 1.0
expect(priceParser.parse("1.000")).toEqual 1.0
it "also handle comma as decimal separator", ->
expect(filter("1,0")).toEqual 1.0
expect(priceParser.parse("1,0")).toEqual 1.0
it "also handle comma as decimal separator", ->
expect(filter("1,00")).toEqual 1.0
expect(priceParser.parse("1,00")).toEqual 1.0
it "also handle comma as decimal separator", ->
expect(filter("11,00")).toEqual 11.0
expect(priceParser.parse("11,00")).toEqual 11.0
it "handle comma as decimal separator but not confusing with thousands separator", ->
expect(filter("11,000")).toEqual 11000
expect(priceParser.parse("11,000")).toEqual 11000
it "handle point as decimal separator and comma as thousands separator", ->
expect(filter("1,000,000.00")).toEqual 1000000
expect(priceParser.parse("1,000,000.00")).toEqual 1000000
it "handle integer number", ->
expect(filter("10")).toEqual 10
expect(priceParser.parse("10")).toEqual 10
it "handle integer number with comma as thousands separator", ->
expect(filter("1,000")).toEqual 1000
expect(priceParser.parse("1,000")).toEqual 1000
it "handle integer number with no thousands separator", ->
expect(filter("1000")).toEqual 1000
expect(priceParser.parse("1000")).toEqual 1000
describe "with comma as decimal separator and final point as thousands separator for I18n service", ->
@@ -55,34 +55,34 @@ describe 'convert string to number with configurated currency', ->
return "1.000"
it "handle comma as decimal separator", ->
expect(filter("1,00")).toEqual 1.0
expect(priceParser.parse("1,00")).toEqual 1.0
it "handle comma as decimal separator with one digit after the comma", ->
expect(filter("11,0")).toEqual 11.0
expect(priceParser.parse("11,0")).toEqual 11.0
it "handle comma as decimal separator with two digit after the comma", ->
expect(filter("11,00")).toEqual 11.0
expect(priceParser.parse("11,00")).toEqual 11.0
it "handle comma as decimal separator with three digit after the comma", ->
expect(filter("11,000")).toEqual 11.0
expect(priceParser.parse("11,000")).toEqual 11.0
it "also handle point as decimal separator", ->
expect(filter("1.00")).toEqual 1.0
expect(priceParser.parse("1.00")).toEqual 1.0
it "also handle point as decimal separator with integer part with two digits", ->
expect(filter("11.00")).toEqual 11.0
expect(priceParser.parse("11.00")).toEqual 11.0
it "handle point as decimal separator and final point as thousands separator", ->
expect(filter("1.000.000,00")).toEqual 1000000
expect(priceParser.parse("1.000.000,00")).toEqual 1000000
it "handle integer number", ->
expect(filter("10")).toEqual 10
expect(priceParser.parse("10")).toEqual 10
it "handle integer number with final point as thousands separator", ->
expect(filter("1.000")).toEqual 1000
expect(priceParser.parse("1.000")).toEqual 1000
it "handle integer number with no thousands separator", ->
expect(filter("1000")).toEqual 1000
expect(priceParser.parse("1000")).toEqual 1000
describe "with comma as decimal separator and space as thousands separator for I18n service", ->
@@ -94,41 +94,42 @@ describe 'convert string to number with configurated currency', ->
return "1 000"
it "handle comma as decimal separator", ->
expect(filter("1,00")).toEqual 1.0
expect(priceParser.parse("1,00")).toEqual 1.0
it "handle comma as decimal separator with one digit after the comma", ->
expect(filter("11,0")).toEqual 11.0
expect(priceParser.parse("11,0")).toEqual 11.0
it "handle comma as decimal separator with two digit after the comma", ->
expect(filter("11,00")).toEqual 11.0
expect(priceParser.parse("11,00")).toEqual 11.0
it "handle comma as decimal separator with three digit after the comma", ->
expect(filter("11,000")).toEqual 11.0
expect(priceParser.parse("11,000")).toEqual 11.0
it "also handle final point as decimal separator", ->
expect(filter("1.00")).toEqual 1.0
expect(priceParser.parse("1.00")).toEqual 1.0
it "also handle final point as decimal separator with integer part with two digits", ->
expect(filter("11.00")).toEqual 11.0
expect(priceParser.parse("11.00")).toEqual 11.0
it "handle point as decimal separator and space as thousands separator", ->
expect(filter("1 000 000,00")).toEqual 1000000
expect(priceParser.parse("1 000 000,00")).toEqual 1000000
it "handle integer number", ->
expect(filter("10")).toEqual 10
expect(priceParser.parse("10")).toEqual 10
it "handle integer number with space as thousands separator", ->
expect(filter("1 000")).toEqual 1000
expect(priceParser.parse("1 000")).toEqual 1000
it "handle integer number with no thousands separator", ->
expect(filter("1000")).toEqual 1000
expect(priceParser.parse("1000")).toEqual 1000
describe "handle null/undefined case", ->
it "null case", ->
expect(filter(null)).toEqual null
expect(priceParser.parse(null)).toEqual null
it "undefined case ", ->
expect(filter(undefined)).toEqual null
expect(priceParser.parse(undefined)).toEqual null
it "wtf case", ->
expect(filter("wtf")).toEqual null
expect(priceParser.parse("wtf")).toEqual null