Sha256: 2bb4e94fd8d288700bc97e571f48ecfb22ba5f7fb08ed7957bfac7266ef7c9d3

Contents?: true

Size: 1.37 KB

Versions: 14

Compression:

Stored size: 1.37 KB

Contents

module Returnly
  class DiscountCalculator
    attr_accessor :order

    DISCOUNTER_CLASSES = {
      'Spree::Order' => Returnly::Discounts::Order,
      'Spree::LineItem' => Returnly::Discounts::LineItem
    }.freeze

    def initialize(order)
      @order = order
    end

    def calculate(line_items = [])
      line_items.inject(0) do |discount_amount, item|
        line_item = find_line_item(item[:order_line_item_id])
        next discount_amount if line_item.nil?

        discount_amount += discount_amount_for(line_item, item[:units].to_i)
        discount_amount
      end
    end

    private

    def discount_amount_for(line_item, units)
      discounters.inject(0) do |amount, discounter|
        amount += discounter.discount_amount(line_item, units)
        amount
      end
    end

    def discounters
      order_promotion_adjustments.map { |promotion_adjustment| build_discounter_by(promotion_adjustment) }.compact
    end

    def build_discounter_by(promotion_adjustment)
      discounter_class = DISCOUNTER_CLASSES[promotion_adjustment.adjustable_type]
      return nil if discounter_class.nil?
      discounter_class.new(order, promotion_adjustment)
    end

    def order_promotion_adjustments
      order.all_adjustments.where(source_type: 'Spree::PromotionAction', eligible: true)
    end

    def find_line_item(id)
      order.line_items.find_by(id: id)
    end
  end
end

Version data entries

14 entries across 14 versions & 2 rubygems

Version Path
spree-returnly-0.13.1 lib/returnly/discount_calculator.rb
solidus-returnly-0.13.1 lib/returnly/discount_calculator.rb
spree-returnly-0.13.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.13.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.12.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.11.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.10.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.9.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.8.1 lib/returnly/discount_calculator.rb
solidus-returnly-0.8.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.7.1 lib/returnly/discount_calculator.rb
solidus-returnly-0.7.0 lib/returnly/discount_calculator.rb
solidus-returnly-0.6.2 lib/returnly/discount_calculator.rb
solidus-returnly-0.6.1 lib/returnly/discount_calculator.rb