Class: Spree::Calculator
- Includes:
- Preferences::Persistable
- Defined in:
- app/models/spree/calculator.rb
Direct Known Subclasses
DefaultTax, FlatFee, FlatRate, ReturnsCalculator, ShippingCalculator
Defined Under Namespace
Modules: Returns, Shipping Classes: DefaultTax, FlatFee, FlatRate
Class Method Summary collapse
-
.description ⇒ String
A description for this calculator in few words.
Instance Method Summary collapse
- #available?(_object) ⇒ Boolean
-
#compute(computable) ⇒ BigDecimal, Numeric
Computes an amount based on the calculable and the computable parameter.
- #description ⇒ Object
- #to_s ⇒ Object
Methods inherited from Base
Methods included from Spree::Core::Permalinks
#generate_permalink, #save_permalink
Class Method Details
.description ⇒ String
A description for this calculator in few words
51 52 53 |
# File 'app/models/spree/calculator.rb', line 51 def self.description model_name.human end |
Instance Method Details
#available?(_object) ⇒ Boolean
65 66 67 |
# File 'app/models/spree/calculator.rb', line 65 def available?(_object) true end |
#compute(computable) ⇒ BigDecimal, Numeric
Computes an amount based on the calculable and the computable parameter.
This method dynamically calls a compute_<computable> method based on the class of the computable parameter. Concrete calculator classes must implement the appropriate compute method for each computable type they support.
For example, if the computable is a Spree::LineItem, this will call compute_line_item(computable, …). If the computable is a Spree::Order, it will call compute_order(computable, …).
37 38 39 40 41 42 43 44 45 46 47 |
# File 'app/models/spree/calculator.rb', line 37 def compute(computable, ...) # Spree::LineItem -> :compute_line_item computable_name = computable.class.name.demodulize.underscore method_name = :"compute_#{computable_name}" calculator_class = self.class if respond_to?(method_name) send(method_name, computable, ...) else raise NotImplementedError, "Please implement '#{method_name}(#{computable_name})' in your calculator: #{calculator_class.name}" end end |
#description ⇒ Object
61 62 63 |
# File 'app/models/spree/calculator.rb', line 61 def description self.class.description end |
#to_s ⇒ Object
57 58 59 |
# File 'app/models/spree/calculator.rb', line 57 def to_s self.class.name.titleize.gsub("Calculator/", "") end |