Sha256: 2f40397bf88df35c7faf9d581a8f90e2496109ab40efdfe91b00f05b56130f4b

Contents?: true

Size: 1.76 KB

Versions: 47

Compression:

Stored size: 1.76 KB

Contents

module Spree
  module ReturnItem::ExchangeVariantEligibility
    class SameOptionValue
      class_attribute :option_type_restrictions
      self.option_type_restrictions = []
      # This can be configured in an initializer, e.g.:
      # Spree::ReturnItem::ExchangeVariantEligibility::SameOptionValue.option_type_restrictions = ["size", "color"]
      #
      # This restriction causes only variants that share the same option value for the
      # specified option types to be returned. e.g.:
      #
      # option_type_restrictions = ["color", "waist"]
      # Variant: blue pants with 32 waist and 30 inseam
      #
      # can be exchanged for:
      # blue pants with 32 waist and 31 inseam
      #
      # cannot be exchanged for:
      # green pants with 32 waist and 30 inseam
      # blue pants with 34 waist and 32 inseam

      def self.eligible_variants(variant, options = {})
        product_variants = SameProduct.eligible_variants(variant, options).includes(option_values: :option_type)
        relevant_option_values = variant.option_values.select { |ov| option_type_restrictions.include? ov.option_type.name }

        if relevant_option_values.present?
          # Finds all the OptionValueVariants that have any of the
          # relevant option values, groups by variant and ensures the variant
          # has ALL of the relevant option values.
          variant_ids = Spree::OptionValuesVariant.
            where(variant_id: product_variants.distinct.pluck(:id)).
            where(option_value: relevant_option_values).
            group(:variant_id).
            having('COUNT(*) = ?', relevant_option_values.size).
            pluck(:variant_id)
          product_variants.where(id: variant_ids)
        else
          product_variants
        end
      end
    end
  end
end

Version data entries

47 entries across 47 versions & 1 rubygems

Version Path
solidus_core-1.2.0.rc1 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.2.0.beta1 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.1.1 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.1.0 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.1.0.pre2 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.1.0.pre1 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb
solidus_core-1.1.0.beta1 app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb