Sha256: 2d929c5cac8c85f3b14b1a774cf3e1a0db1196a433455da0d412cb504ab16d24

Contents?: true

Size: 1001 Bytes

Versions: 8

Compression:

Stored size: 1001 Bytes

Contents

require_dependency 'spree/calculator'

module Spree
  class Calculator::TieredFlatRate < Calculator
    preference :base_amount, :decimal, default: 0
    preference :tiers, :hash, default: {}

    before_validation do
      # Convert tier values to decimals. Strings don't do us much good.
      if preferred_tiers.is_a?(Hash)
        self.preferred_tiers = preferred_tiers.map do |k, v|
          [BigDecimal.new(k.to_s), BigDecimal.new(v.to_s)]
        end.to_h
      end
    end

    validate :preferred_tiers_content

    def compute(object)
      _base, amount = preferred_tiers.sort.reverse.detect{ |b, _| object.amount >= b }
      amount || preferred_base_amount
    end

    private

    def preferred_tiers_content
      if preferred_tiers.is_a? Hash
        unless preferred_tiers.keys.all?{ |k| k.is_a?(Numeric) && k > 0 }
          errors.add(:base, :keys_should_be_positive_number)
        end
      else
        errors.add(:preferred_tiers, :should_be_hash)
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
solidus_core-2.2.2 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.1.1 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.2.1 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.2.0 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.2.0.rc1 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.2.0.beta1 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.1.0 app/models/spree/calculator/tiered_flat_rate.rb
solidus_core-2.1.0.rc1 app/models/spree/calculator/tiered_flat_rate.rb