Skip to content
Last update: March 14, 2024

Extend Product Completeness Evaluation Process

The Catalog Publishing Module allows to evaluate the completeness of products for publication according to specified criteria.

Readmore Catalog Publishing Module

In this guide, we will show how to extend the product completeness evaluation process to allow full customization. Below are potential user scenarios along with solutions.

Add New Detail to Default Evaluation Process

To integrate additional details into the default evaluation process:

  1. Inherit your detail evaluator from DefaultCompletenessDetailEvaluator class.
  2. Override EvaluateCompleteness method:

    public class CustomCompletenessDetailEvaluator : DefaultCompletenessDetailEvaluator
    {
        public override CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
        {
        }
    }
    
  3. Register this class as implementation of DefaultCompletenessDetailEvaluator in Unity:

    _container.RegisterType<DefaultCompletenessDetailEvaluator, CustomCompletenessDetailEvaluator>(nameof(CustomCompletenessDetailEvaluator));
    

The default product completeness evaluator includes your detail evaluator in evaluation process.

Define Own Product Completeness Evaluator

To create your own product completeness evaluator, you can:

public class CustomCompletenessEvaluator : ICompletenessEvaluator
{
    public CompletenessEntry[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
    {
    }
}
public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator
{
    public override CompletenessEntry[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
    {
    }
}

After that, register your class as implementation of ICompletenessEvaluator in Unity:

_container.RegisterType<ICompletenessEvaluator, CustomCompletenessEvaluator>(nameof(CustomCompletenessEvaluator));

Now your product completeness evaluator is available in module's REST API and UI.

Define Own Product Completeness Evaluator

If you want to define your own product completeness evaluation process, you can implement the same extensibility logic as ours:

public class CustomCompletenessEvaluator : ICompletenessEvaluator
{
    protected IReadOnlyCollection<ICompletenessDetailEvaluator> DetailEvaluators { get; }

    public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) :
        this(detailEvaluators as ICompletenessDetailEvaluator[], productService)
    {
    }

    protected CustomCompletenessEvaluator(ICompletenessDetailEvaluator[] detailEvaluators, IItemService productService)
    {
        _productService = productService;
        DetailEvaluators = detailEvaluators;
    }

    public virtual CompletenessEntry[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
    {
    }
}

If you prefer not to define your own product completeness evaluation process from scratch, you can simply customize the default process provided by inheriting from the DefaultCompletenessEvaluator. Here are the options for customizing your product completeness evaluator:

Default Detail Evaluators

To use the default detail evaluators provided:

  1. Inject DefaultCompletenessDetailEvaluator array to your constructor.
  2. Pass it to the protected constructor of the DefaultCompletenessEvaluator base class:
    public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator
    {
        private readonly IItemService _productService;
    
        public CustomCompletenessEvaluator(DefaultCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) :
            base(detailEvaluators as ICompletenessDetailEvaluator[], productService)
        {
        }
    }
    

Custom Detail Evaluators

To implement your own custom detail evaluators:

  1. Create your own (possible, abstract) base class for detail evaluators.
  2. Inherit all your detail evaluators from it:
    public abstract class CustomCompletenessDetailEvaluator : ICompletenessDetailEvaluator
    {
        public abstract CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products);
    }
    
    
    public class CustomCompletenessDetailEvaluator1 : CustomCompletenessDetailEvaluator
    {
        public override CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
        {
        }
    }
    
    
    public class CustomCompletenessDetailEvaluator2 : CustomCompletenessDetailEvaluator
    {
        public override CompletenessDetail[] EvaluateCompleteness(CompletenessChannel channel, CatalogProduct[] products)
        {
        }
    }
    
  3. Inject CustomCompletenessDetailEvaluator array into the constructor of your product completeness evaluator and pass this array to the protected constructor of the DefaultCompletenessEvaluator base class:

    public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator
    {
        private readonly IItemService _productService;
    
        public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService) :
            base(detailEvaluators as ICompletenessDetailEvaluator[], productService)
        {
        }
    }
    

  4. Register your detail evaluators as implementation of CustomCompletenessEvaluator class in Unity:

    _container.RegisterType<CustomCompletenessEvaluator, CustomCompletenessEvaluator1>(nameof(CustomCompletenessEvaluator1));
    _container.RegisterType<CustomCompletenessEvaluator, CustomCompletenessEvaluator2>(nameof(CustomCompletenessEvaluator2));
    

Combine Default and Custom Detail Evaluators

To combine both default and custom detail evaluators:

  1. Inject both DefaultCompletenessDetailEvaluator and CustomCompletenessDetailEvaluator arrays (see code above). Then concatenate them.
  2. Pass this array to the protected constructor of the DefaultCompletenessEvaluator base class:

    public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator
    {
        private readonly IItemService _productService;
    
        public CustomCompletenessEvaluator(DefaultCompletenessDetailEvaluator[] defaultDetailEvaluators, CustomCompletenessDetailEvaluator[] customDetailEvaluators, IItemService productService) :
            base(defaultDetailEvaluators.Concat<ICompletenessDetailEvaluator>(customDetailEvaluators).ToArray(), productService)
        {
        }
    }
    

Mix Default and All Custom Detail Evaluators

To mix default and all custom detail evaluators:

  1. Create an array of instances of default detail evaluators.
  2. Inject CustomCompletenessDetailEvaluator arrays (see code above). Then concatenate them.
  3. Pass this array to the protected constructor of the DefaultCompletenessEvaluator base class:

    public class CustomCompletenessEvaluator : DefaultCompletenessEvaluator
    {
        private readonly IItemService _productService;
        private readonly IPricingSearchService _pricingSearchService;
    
        public CustomCompletenessEvaluator(CustomCompletenessDetailEvaluator[] detailEvaluators, IItemService productService, IPricingSearchService pricingSearchService) :
            base(new[] { new PropertiesCompletenessDetailEvaluator(), new PricesCompletenessDetailEvaluator(pricingSearchService) }.Concat<ICompletenessDetailEvaluator>(customDetailEvaluators).ToArray(), productService)
        {
        }
    }