Remove localized number logic from calculators

The browser is now responsible for dealing with the decimal separator, for all numeric preferences (as input[type=number]; see Spree::Admin::BaseHelper::preference_field_tag). Calculators are the only place that numeric preferences are used.

It will enforce that only one comma or dot (depending on user's locale) is entered, thus avoiding any ambiguity, and mis-interpretation (eg 100,001 could be interpreted as more than 100 thousand or 100 with a decimal place).
This commit is contained in:
David Cook
2023-04-28 11:59:47 +10:00
parent 43e51cb592
commit a46eef291c
12 changed files with 6 additions and 89 deletions

View File

@@ -1,18 +1,11 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlatPercentItemTotal < Spree::Calculator
extend Spree::LocalizedNumber
preference :flat_percent, :decimal, default: 0
localize_number :preferred_flat_percent
validates :preferred_flat_percent,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
Spree.t(:flat_percent)

View File

@@ -1,22 +1,15 @@
# frozen_string_literal: true
require 'spree/localized_number'
class Calculator::FlatPercentPerItem < Spree::Calculator
# Spree's FlatPercentItemTotal calculator sums all amounts, and then calculates a percentage
# on them.
# In the cart, we display line item individual amounts rounded, so to have consistent
# calculations we do the same internally. Here, we round adjustments at the individual
# item level first, then multiply by the item quantity.
extend Spree::LocalizedNumber
preference :flat_percent, :decimal, default: 0
localize_number :preferred_flat_percent
validates :preferred_flat_percent,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
I18n.t(:flat_percent_per_item)

View File

@@ -1,18 +1,11 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlatRate < Spree::Calculator
extend Spree::LocalizedNumber
preference :amount, :decimal, default: 0
localize_number :preferred_amount
validates :preferred_amount,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
I18n.t(:flat_rate_per_order)

View File

@@ -1,22 +1,14 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class FlexiRate < Spree::Calculator
extend Spree::LocalizedNumber
preference :first_item, :decimal, default: 0.0
preference :additional_item, :decimal, default: 0.0
preference :max_items, :integer, default: 0
localize_number :preferred_first_item,
:preferred_additional_item
validates :preferred_first_item,
:preferred_additional_item,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
I18n.t(:flexible_rate)

View File

@@ -1,18 +1,11 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class PerItem < Spree::Calculator
extend Spree::LocalizedNumber
preference :amount, :decimal, default: 0
localize_number :preferred_amount
validates :preferred_amount,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
I18n.t(:flat_rate_per_item)

View File

@@ -1,24 +1,15 @@
# frozen_string_literal: false
require 'spree/localized_number'
module Calculator
class PriceSack < Spree::Calculator
extend Spree::LocalizedNumber
preference :minimal_amount, :decimal, default: 0
preference :normal_amount, :decimal, default: 0
preference :discount_amount, :decimal, default: 0
localize_number :preferred_minimal_amount,
:preferred_normal_amount,
:preferred_discount_amount
validates :preferred_minimal_amount,
:preferred_normal_amount,
:preferred_discount_amount,
numericality: { message: :calculator_preferred_value_error },
unless: -> { Spree::Config.enable_localized_number? }
numericality: { message: :calculator_preferred_value_error }
def self.description
I18n.t(:price_sack)