Sha256: 6985c2ec10ed22a4d4b89514e86efb2a816dbb8c3b4473d3466438b4d3eda924

Contents?: true

Size: 1.44 KB

Versions: 20

Compression:

Stored size: 1.44 KB

Contents

module Spree
  # A calculator for promotions that calculates a percent-off discount
  # for all matching products in an order. This should not be used as a
  # shipping calculator since it would be the same thing as a flat percent
  # off the entire order.
  #
  #
  # TODO Should be deprecated now that we have adjustments at the line item level in spree core

  class Calculator::PercentPerItem < Calculator
    preference :percent, :decimal, default: 0

    def compute(object = nil)
      return 0 if object.nil?
      object.line_items.map { |line_item|
        value_for_line_item(line_item)
      }.sum
    end

    private

    # Returns all products that match this calculator, but only if the calculator
    # is attached to a promotion. If attached to a ShippingMethod, nil is returned.
    # Copied from per_item.rb
    def matching_products
      if compute_on_promotion?
        calculable.promotion.rules.map do |rule|
          rule.respond_to?(:products) ? rule.products : []
        end.flatten
      end
    end

    def value_for_line_item(line_item)
      if compute_on_promotion?
        return 0 unless matching_products.blank? || matching_products.include?(line_item.product)
      end
      ((line_item.price * line_item.quantity) * preferred_percent) / 100
    end

    # Determines wether or not the calculable object is a promotion
    def compute_on_promotion?
      @compute_on_promotion ||= calculable.respond_to?(:promotion)
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
solidus_core-2.4.2 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.4.1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.2.2 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.1.1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.4.0 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.4.0.rc1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.4.0.beta1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.0 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.0.rc3 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.0.rc2 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.0.rc1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.3.0.beta1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.2.1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.2.0 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.2.0.rc1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.2.0.beta1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.1.0 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.1.0.rc1 app/models/spree/calculator/percent_per_item.rb
solidus_core-2.1.0.beta1 app/models/spree/calculator/percent_per_item.rb