Class: Coupon::Calculator::VolumePricingCalculator

Inherits:
Base
  • Object
show all
Defined in:
app/services/coupon/calculator/volume_pricing_calculator.rb

Instance Method Summary collapse

Constructor Details

#initialize(line_item_extractor, options = {}) ⇒ VolumePricingCalculator

options:
:price_per_volume_unit (required), the price per sqft
:msrp (optional) set to true to base off msrp instead of discounted
:volume_method set to :sq_ft or :linear_ft



6
7
8
9
10
11
# File 'app/services/coupon/calculator/volume_pricing_calculator.rb', line 6

def initialize(line_item_extractor, options = {})
  raise 'Missing required :price_per_volume_unit option specified' unless options[:price_per_volume_unit].present?
  raise 'Missing required :volume_method either :sq_ft or :linear_ft' unless %i[sq_ft linear_ft].include? options[:volume_method]

  super
end

Instance Method Details

#calculate(discount) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/services/coupon/calculator/volume_pricing_calculator.rb', line 28

def calculate(discount)
  @line_item_extractor.discountable_line_items.each do |line_item|
    logger.info "Calculating discount on line item #{line_item.id} for discount #{discount.id}"
    if volume = retrieve_volume(line_item)
      new_unit_amount = volume * @options[:price_per_volume_unit]
      new_unit_amount = new_unit_amount.ceil(2)
      allocated_unit_amount = -[retrieve_base_amount(line_item) - new_unit_amount, 0].max
      allocate_to_line(line_item, discount, allocated_unit_amount)
    else
      msg = "Coupon #{discount.coupon.code} on discount id #{discount.id}, #{discount.itemizable_type}:#{discount.itemizable_id} could not figure out volume for line item #{line_item.id} #{line_item.item.sku}, this is indicative of a bad product data setup or a bad coupon filter."
      logger.error "!!! #{msg}"
      ErrorReporting.warning(msg)
    end
  end
end

#retrieve_base_amount(line_item) ⇒ Object



24
25
26
# File 'app/services/coupon/calculator/volume_pricing_calculator.rb', line 24

def retrieve_base_amount(line_item)
  @options[:msrp] ? line_item.price : line_item.discounted_price
end

#retrieve_volume(line_item) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'app/services/coupon/calculator/volume_pricing_calculator.rb', line 13

def retrieve_volume(line_item)
  case @options[:volume_method]
  when :sq_ft
    line_item.item.sqft
  when :linear_ft
    line_item.item.linear_ft
  else
    raise "Invalid volume method option: #{@options[:volume_method]}"
  end
end