Class: SolidusFriendlyPromotions::Conditions::Product

Inherits:
SolidusFriendlyPromotions::Condition show all
Includes:
LineItemApplicableOrderCondition
Defined in:
app/models/solidus_friendly_promotions/conditions/product.rb

Overview

A condition 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 condition.

Constant Summary collapse

MATCH_POLICIES =
%w[any all none only].freeze

Instance Method Summary collapse

Methods included from LineItemApplicableOrderCondition

#applicable?, #eligible?, included, #level

Methods inherited from SolidusFriendlyPromotions::Condition

#applicable?, #eligibility_errors, #eligible?, #level, #to_partial_path, #updateable?

Instance Method Details

#eligible_productsObject

scope/association that is used to test eligibility



29
30
31
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 29

def eligible_products
  products
end

#line_item_eligible?(line_item, _options = {}) ⇒ Boolean

Returns:

  • (Boolean)


63
64
65
66
67
68
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 63

def line_item_eligible?(line_item, _options = {})
  # The order level eligibility check happens first, and if none of the products
  # are in the order, then no line items should be available to check.
  raise "This should not happen" if preferred_match_policy == "none"
  product_ids.include?(line_item.variant.product_id)
end

#order_eligible?(order) ⇒ Boolean

Returns:

  • (Boolean)


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
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 33

def order_eligible?(order)
  return true if eligible_products.empty?

  case preferred_match_policy
  when "all"
    unless eligible_products.all? { |product| order_products(order).include?(product) }
      eligibility_errors.add(:base, eligibility_error_message(:missing_product), error_code: :missing_product)
    end
  when "any"
    unless order_products(order).any? { |product| eligible_products.include?(product) }
      eligibility_errors.add(:base, eligibility_error_message(:no_applicable_products),
        error_code: :no_applicable_products)
    end
  when "none"
    unless order_products(order).none? { |product| eligible_products.include?(product) }
      eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product),
        error_code: :has_excluded_product)
    end
  when "only"
    unless order_products(order).all? { |product| eligible_products.include?(product) }
      eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product),
        error_code: :has_excluded_product)
    end
  else
    raise "unexpected match policy: #{preferred_match_policy.inspect}"
  end

  eligibility_errors.empty?
end

#preload_relationsObject



18
19
20
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 18

def preload_relations
  [:products]
end

#product_ids_stringObject



70
71
72
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 70

def product_ids_string
  product_ids.join(",")
end

#product_ids_string=(product_ids) ⇒ Object



74
75
76
# File 'app/models/solidus_friendly_promotions/conditions/product.rb', line 74

def product_ids_string=(product_ids)
  self.product_ids = product_ids.to_s.split(",").map(&:strip)
end