Sha256: 64d2a7104f350df1699239587d75793fa376cc9139894a2965472328d520f081

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

# frozen_string_literal: true

module SolidusFriendlyPromotions
  module Conditions
    # A condition to apply a promotion only to line items with or without a chosen product
    class LineItemProduct < Condition
      include LineItemLevelCondition

      MATCH_POLICIES = %w[include exclude].freeze

      has_many :condition_products,
        dependent: :destroy,
        foreign_key: :condition_id,
        class_name: "SolidusFriendlyPromotions::ConditionProduct"
      has_many :products,
        class_name: "Spree::Product",
        through: :condition_products

      preference :match_policy, :string, default: MATCH_POLICIES.first

      def eligible?(line_item, _options = {})
        order_includes_product = product_ids.include?(line_item.variant.product_id)
        success = inverse? ? !order_includes_product : order_includes_product

        unless success
          message_code = inverse? ? :has_excluded_product : :no_applicable_products
          eligibility_errors.add(
            :base,
            eligibility_error_message(message_code),
            error_code: message_code
          )
        end

        success
      end

      def product_ids_string
        product_ids.join(",")
      end

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

      private

      def inverse?
        preferred_match_policy == "exclude"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
solidus_friendly_promotions-1.9.0 app/models/solidus_friendly_promotions/conditions/line_item_product.rb