Filtering category products that are out of stock

A question was asked how to configure Commerce Server 2009's default site to filter out products where the OnHandQuantity=0.

This filter setting is stored in the CategoryConfiguration object which Commerce Server passes into the core subsystems when retrieving a category.

Although you cant change the out of the box component, you can change the CategoryConfiguration object that it uses.

When Commerce Server retrieves a category it first checks the operationCache for a copy of the CategoryConfiguration and then creates a default one, if it is not found.

If you want to override the default behavior, what you need to do is create an OperationSequenceComponent that executes right before the “Category_Loader” OSC in the QueryOperation_Category operation like this:

This is your ChannelConfiguration.config:

      <MessageHandler name="CommerceQueryOperation_Category" responseType="Microsoft.Commerce.Contracts.Messages.CommerceQueryOperationResponse, Microsoft.Commerce.Contracts, Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35">

        <OperationSequence>

      <!—This one is added à

          <Component name="OnHandFilter" type="Microsoft.Commerce.Samples.OnHandFilter, OnHandFilter, Version=1.0.0.0, Culture=neutral,PublicKeyToken=62d299e5f36470e7">

            <!—This one is added à

          <Component name="Category_Loader" type="Microsoft.Commerce.Providers.Components.CategoryLoader, Microsoft.Commerce.Providers, Version=1.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" />

         

   

The component would look like this:

public class OnHandFilter:OperationSequenceComponent

    {

        public override void ExecuteQuery(Microsoft.Commerce.Contracts.Messages.CommerceQueryOperation queryOperation, Microsoft.Commerce.Broker.OperationCacheDictionary operationCache, Microsoft.Commerce.Contracts.Messages.CommerceQueryOperationResponse response)

        {

            var categoryConfiguration = new Microsoft.CommerceServer.Catalog.CategoryConfiguration();

            categoryConfiguration.InventoryOptions = new Microsoft.CommerceServer.Inventory.InventoryOptions();

            categoryConfiguration.InventoryOptions.FilterOutOfStockSkus = true;

            operationCache.Add("CategoryContentSelectorKey_D6E2DE05-01E0-4a35-BF26-BCF95971B8D1", categoryConfiguration);

        }

    }

You can actually override any of the CategoryConfiguration properties this way.

I tested the above on our out of the box site and it does what you are looking for.

You could further enhance this by making a single generic OperationSequenceComponent that exposes those configuration properties in the CategoryConfiguration object as configurable properties.

I will explore that in my next blog entry.