Class: Coupon::Calculator::VolumePricingCalculator
- Inherits:
-
Base
- Object
- Base
- Coupon::Calculator::VolumePricingCalculator
- Defined in:
- app/services/coupon/calculator/volume_pricing_calculator.rb
Instance Method Summary collapse
- #calculate(discount) ⇒ Object
-
#initialize(line_item_extractor, options = {}) ⇒ VolumePricingCalculator
constructor
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.
- #retrieve_base_amount(line_item) ⇒ Object
- #retrieve_volume(line_item) ⇒ Object
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, = {}) raise 'Missing required :price_per_volume_unit option specified' unless [:price_per_volume_unit].present? raise 'Missing required :volume_method either :sq_ft or :linear_ft' unless %i[sq_ft linear_ft].include? [: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 |