Class: Coupon::Calculator::Builder

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

Overview

Base class of the discount calculator system, inherited by specialized calculation
Also serves as a calculator factory passing a coupon to the create method

Class Method Summary collapse

Class Method Details

.create_calculator(calculation_type, extractor, options) ⇒ Coupon::Calculator::Base

Instantiate a calculator based on the calculation type, extract and tax class, also options
must be specified depending on the coupon calculation type:
:percentage_off
:flat_amount

Parameters:

  • calculation_type (String)

    coupon calculation type code ('%', '$', …)

  • extractor (ProductFilter::LineExtractor)

    line item extractor

  • options (Hash)

    calculator options

Options Hash (options):

  • percentage_off (Float)

    percentage to apply, e.g. 0.02 for 2%

  • flat_amount (Numeric)

    flat amount to take off / force as unit price

Returns:



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/services/coupon/calculator/builder.rb', line 15

def self.create_calculator(calculation_type, extractor, options)
  case calculation_type
  when '%'
    Coupon::Calculator::PercentageOff.new(extractor, { percentage_off: options[:percentage_off] })
  when '%M'
    Coupon::Calculator::PercentageOff.new(extractor, { percentage_off: options[:percentage_off], msrp: true })
  when '%V'
    Coupon::Calculator::PercentageOff.new(extractor, { percentage_off: options[:percentage_off], price_with_vat: true })
  when '%1'
    Coupon::Calculator::PercentageOffPerQtyMet.new(extractor, percentage_off: options[:percentage_off])
  when '$'
    Coupon::Calculator::FlatAmountOff.new(extractor, { flat_amount: options[:flat_amount] })
  when '$1'
    Coupon::Calculator::FlatAmountOffPerUnit.new(extractor, { flat_amount: options[:flat_amount] })
  when 'DP'
    Coupon::Calculator::ForceDiscountUnitPrice.new(extractor, { unit_price: options[:flat_amount] })
  when 'MP'
    Coupon::Calculator::ForceMsrpUnitPrice.new(extractor, { unit_price: options[:flat_amount] })
  when '?'
    Coupon::Calculator::AdjustableAmount.new(extractor)
  when '+?'
    Coupon::Calculator::AdjustableAmount.new(extractor, { method: :add })
  when '-?'
    Coupon::Calculator::AdjustableAmount.new(extractor, { method: :subtract })
  when 'SF'
    Coupon::Calculator::VolumePricingCalculator.new(extractor,
                      { price_per_volume_unit: options[:flat_amount],
                        msrp: true,
                        volume_method: :sq_ft })
  when 'LF'
    Coupon::Calculator::VolumePricingCalculator.new(extractor,
            { price_per_volume_unit: options[:flat_amount],
              msrp: true,
              volume_method: :linear_ft })
  when 'SD'
    Coupon::Calculator::VolumePricingCalculator.new(extractor,
                      { price_per_volume_unit: options[:flat_amount],
                        msrp: false,
                        volume_method: :sq_ft })

  when 'LD'
    Coupon::Calculator::VolumePricingCalculator.new(extractor,
                      { price_per_volume_unit: options[:flat_amount],
                        msrp: false,
                        volume_method: :linear_ft })
  when 'MX'
    Coupon::Calculator::PromoMatrix.new(extractor)
  end
end