Durante el proceso de instalación de Sitecore Commerce 8.2.1 con Commerce Server, uno de los pasos es actualizar/instalar una serie de paquetes los cuales actualizan/instalan algunos módulos (aplicaciones SPEAK) que nos permiten integrarnos con algunas funcionalidades de Commerce Server, una de ellas es “Pricing & Promotions”. Una vez instalada podemos ver en nuestro Sitecore Launchpad un acceso a dicha aplicación:

Si has creado una promoción utilizando este módulo seguramente has notado la sección “Qualifications” o cualificaciones en español, ya que es una información que es requerida para crear una promoción.
Las cualificaciones son condiciones que deben cumplirse para que la promoción pueda ser aplicada, si tan sólo una no se cumple la promoción deja de aplicarse.
Cuando adicionamos una cualificación, lo primero que Sitecore nos pide es seleccionar el tipo de condición, como por ejemplo: “¿El carro de compra tiene productos?”, “¿La cantidad de productos en el carro de compra está en un rango [mín]-[máx]?”, “¿Es un mes en específico?”, entre otros…

Condición personalizada
¿Qué tal si ninguna de las condiciones existentes satisface las necesidades de las reglas requeridas por el negocio para la promoción que necesitamos crear? es aquí cuando necesitamos crear una “condición personalizada”.
Para crear una condición personalizada debemos crear una clase en alguno de nuestros plugins (o crear un plugin nuevo) en nuestra solución de Sitecore Commerce Engine.
Como parte de este post vamos a crear una condición bien sencilla, la cual va a validar que un número especificado es impar. El siguiente código es la implementación de la condición, el cual vamos a explicar más adelante:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 1 | |
using Sitecore.Framework.Rules; | |
namespace MiTienda.Commerce.Plugin.Custom.Conditions | |
{ | |
// 2 | |
[EntityIdentifier("¿El número [especificado] es impar?")] | |
// 3 | |
public class NumeroEsImparCondition : ICondition | |
{ | |
// 4 | |
public IRuleValue<int> Numero { get; set; } | |
// 5 | |
public bool Evaluate(IRuleExecutionContext context) | |
{ | |
// 6 | |
return Numero.Yield(context) % 2 != 0; | |
} | |
} | |
} |
- Importamos el namespace Sitecore.Framework.Rules el cual contiene interfaces y clases que necesitamos utilizar durante la implementación de la clase.
- El atributo EntityIdentifier nos permite establecer la metadata de la condición, en este caso el identificador que se va a mostrar luego en la intefaz de usuario en la aplicación SPEAK.
- La clase debe implementar la interfaz ICondition, es la forma mediante la cual definimos que esta clase representa una condición en el framework de reglas de Sitecore.
- Definimos la propiedad “Numero” que es de tipo IRuleValue, el cual es un tipo genérico donde podemos definir el tipo de dato de la propiedad (en este caso int), mediante la cual podemos proporcionar luego en la interfaz de usuario el número que queremos determinar si es impar o no, en otras palabras, es el mecanismo mediante la cual podemos pasar información a la condición desde la interfaz de usuario cuando la condición es creada.
- Implementamos el método Evaluate() que está definido en la interfaz ICondition, el cual está encargado de determinar el resultado de la condición. Debe retornar true si la condición evaluada satisfactoriamente.
- Determinamos si el número es impar o no.
Luego de implementar esta clase debemos desplegar el Sitecore Commerce Engine para que Sitecore pueda “descubrir” esta nueva condición, como podemos ver en la siguiente imágen cuando intentamos adicionar una nueva condición:

Si aceptamos este tipo de condición, el segundo paso es proporcionar los valores de las propiedades que definimos como IRuleValue:

Como podemos ver, Sitecore nos pide que proporcionemos los valores para todas las propiedades definidas como IRuleValue, en este caso sólo “Numero” y finalmente podemos ver la nueva condición adicionada en el listado de cualificaciones:

Conclusiones
Pudimos ver lo sencillo que es adicionar una nueva condición, en este caso su implementación fue muy simple pero puede ser tan compleja como queramos, pudiendo obtener el carro de comprar y tomar decisiones basadas en su estado o acceder al catalogo de productos, repositorio de precios o sistema de inventario, etc., en fin, podemos ser bien creativos a la hora de crear nuevas condiciones para nuestras promociones, incluso crear una librería de condiciones que podamos reutilizar en todos nuestros proyectos.
[…] el post anterior vimos cómo crear una condición personalizada para ser utilizada en una promoción, pero ¿qué tal si al igual que en el caso de las […]