Class: Spree::Promotion::Rules::Product
- Inherits:
-
Spree::PromotionRule
- Object
- ActiveRecord::Base
- Base
- Spree::PromotionRule
- Spree::Promotion::Rules::Product
- Defined in:
- app/models/spree/promotion/rules/product.rb
Overview
A rule to limit a promotion based on products in the order. Can require all or any of the products to be present. Valid products either come from assigned product group or are assingned directly to the rule.
Constant Summary collapse
- MATCH_POLICIES =
%w(any all none)
Instance Method Summary collapse
- #actionable?(line_item) ⇒ Boolean
- #applicable?(promotable) ⇒ Boolean
- #eligible?(order, _options = {}) ⇒ Boolean
-
#eligible_products ⇒ Object
scope/association that is used to test eligibility.
- #product_ids_string ⇒ Object
- #product_ids_string=(product_ids) ⇒ Object
Methods inherited from Spree::PromotionRule
#eligibility_errors, for, #to_partial_path
Methods inherited from Base
display_includes, #initialize_preference_defaults, page, preference
Methods included from Spree::Preferences::Preferable
#admin_form_preference_names, #default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference
Instance Method Details
#actionable?(line_item) ⇒ Boolean
53 54 55 56 57 58 59 60 61 62 |
# File 'app/models/spree/promotion/rules/product.rb', line 53 def actionable?(line_item) case preferred_match_policy when 'any', 'all' product_ids.include? line_item.variant.product_id when 'none' product_ids.exclude? line_item.variant.product_id else raise "unexpected match policy: #{preferred_match_policy.inspect}" end end |
#applicable?(promotable) ⇒ Boolean
26 27 28 |
# File 'app/models/spree/promotion/rules/product.rb', line 26 def applicable?(promotable) promotable.is_a?(Spree::Order) end |
#eligible?(order, _options = {}) ⇒ Boolean
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'app/models/spree/promotion/rules/product.rb', line 30 def eligible?(order, = {}) return true if eligible_products.empty? case preferred_match_policy when 'all' unless eligible_products.all? { |p| order.products.include?(p) } eligibility_errors.add(:base, (:missing_product)) end when 'any' unless order.products.any? { |p| eligible_products.include?(p) } eligibility_errors.add(:base, (:no_applicable_products)) end when 'none' unless order.products.none? { |p| eligible_products.include?(p) } eligibility_errors.add(:base, (:has_excluded_product)) end else raise "unexpected match policy: #{preferred_match_policy.inspect}" end eligibility_errors.empty? end |
#eligible_products ⇒ Object
scope/association that is used to test eligibility
22 23 24 |
# File 'app/models/spree/promotion/rules/product.rb', line 22 def eligible_products products end |
#product_ids_string ⇒ Object
64 65 66 |
# File 'app/models/spree/promotion/rules/product.rb', line 64 def product_ids_string product_ids.join(',') end |
#product_ids_string=(product_ids) ⇒ Object
68 69 70 |
# File 'app/models/spree/promotion/rules/product.rb', line 68 def product_ids_string=(product_ids) self.product_ids = product_ids.to_s.split(',').map(&:strip) end |