La eficiencia operativa y la experiencia del cliente son cruciales para el éxito en el comercio electrónico. Para las empresas que buscan optimizar sus procesos y ofrecer una experiencia de compra fluida, la API de Workflow de SAP Commerce es una herramienta valiosa. Exploremos cómo esta solución puede transformar la gestión de procesos y mejorar la eficiencia, ayudando a los tomadores de decisiones a entender su valor e implementación.
¿Qué es la API de Workflow de SAP Commerce?
La API de Workflow en SAP Commerce Cloud automatiza flujos de trabajo complejos, desde la definición de plantillas hasta la generación de instancias de workflow en tiempo real. Es ideal para negocios con operaciones regulares que requieren tanto interacciones humanas como tareas automatizadas, asegurando consistencia y eficiencia en cada paso.
Beneficios para los Tomadores de Decisiones
Automatización de Procesos
La automatización reduce los errores humanos y acelera las operaciones. La API de Workflow permite que actividades como la creación y revisión de precios de productos, llamadas a servicios web y validaciones sean automatizadas, liberando a los equipos para que se concentren en tareas estratégicas.
Flexibilidad y Control
La personalización de workflows para satisfacer las necesidades específicas del negocio proporciona un control operativo sin precedentes. Cada paso, desde la creación del producto hasta su disponibilidad en el mercado, puede ser orquestado con precisión.
Integración y Escalabilidad
Accesible a través de código Java o interfaces REST/SOAP, la API se integra fácilmente con otros sistemas. Esto es crucial para las empresas que buscan escalabilidad e integración fluida entre diferentes plataformas.
Caso de Uso: Transformando la Experiencia de Compra
Considere un escenario en el que la creación, revisión y validación de precios de productos estén completamente automatizadas. Esto no solo acelera el tiempo de lanzamiento al mercado, sino que también garantiza que los precios estén siempre actualizados y aprobados, mejorando la satisfacción del cliente.
Creación del Precio del Producto
Responsable: Usuario Creador
Acción: Definir el precio inicial del producto.
Revisión del Precio
Responsable: Usuario Aprobador
Acción: Revisar y aprobar el precio definido.
Llamada a Servicio Web
Responsable: Sistema Automatizado
Acción: Enviar datos a un servicio web externo.
Validación Final
Responsable: Administrador del Workflow
Acción: Validar y finalizar el precio del producto.
Implementación de la API de Workflow
Para empezar, cree plantillas de workflow, defina acciones y decisiones, y finalmente instancie e inicie el workflow. Usando scripts Groovy, los desarrolladores pueden automatizar y personalizar fácilmente estos procesos.
import de.hybris.platform.workflow.model.WorkflowTemplateModel;
import de.hybris.platform.workflow.model.WorkflowActionTemplateModel;
import de.hybris.platform.workflow.enums.WorkflowActionType;
import de.hybris.platform.workflow.model.WorkflowDecisionTemplateModel;
import de.hybris.platform.workflow.model.AutomatedWorkflowActionTemplateModel;
import de.hybris.platform.workflow.model.WorkflowModel;
import de.hybris.platform.workflow.model.WorkflowItemAttachmentModel;
import de.hybris.platform.core.model.product.ProductModel;
import java.util.Locale;
import java.util.ArrayList;
import java.util.List;
import de.hybris.platform.core.model.ItemModel;
import java.util.Collection;
import java.util.Collections;
modelService = spring.getBean('modelService');
userService = spring.getBean('userService');
productService = spring.getBean('productService');
catalogVersionService = spring.getBean('catalogVersionService')
workflowService = spring.getBean('workflowService');
workflowTemplateService = spring.getBean('workflowTemplateService');
workflowProcessingService = spring.getBean('workflowProcessingService');
newestWorkflowService = spring.getBean('newestWorkflowService');
workflowTemplateCode = "productPriceWorkflowTemplate";
workflowTemplateName = "product price workflow template";
//action code | action name | action user | action type | jobHandler
ACTION_PLAN = """
createProductPriceAction|create product price|creatorUser1|START
createProductPriceReviewAction|create product price review|approverUser1|NORMAL
makeWebserviceCallForPriceAction|make webservice call for price|workflowAdminUser1|NORMAL|shopzoneAutomatedWorkflowAction
createProductPriceSignOffAction|create product price sign off|workflowAdminUser1|END
""";
//decision code | decision name | origin action for this decision
DECISION_PLAN = """
productPriceCompletedDecision|product price completed|createProductPriceAction
productPriceApprovedDecision|product price approved|createProductPriceReviewAction
productPriceRejectedDecision|product price rejected|createProductPriceReviewAction
webservicesCallSuccessDecision|webservice call success|makeWebserviceCallForPriceAction
webservicesCallFailureDecision|webservice call failure|makeWebserviceCallForPriceAction
""";
//decision code | target next action for this decision
WORKFLOW_LINK = """
productPriceCompletedDecision|createProductPriceReviewAction
productPriceApprovedDecision|makeWebserviceCallForPriceAction
productPriceRejectedDecision|createProductPriceAction
webservicesCallSuccessDecision|createProductPriceSignOffAction
webservicesCallFailureDecision|createProductPriceReviewAction
""";
prepareWorkflow(ACTION_PLAN,DECISION_PLAN,WORKFLOW_LINK);
def prepareWorkflow(ACTION_PLAN,DECISION_PLAN,WORKFLOW_LINK)
{
WorkflowTemplateModel workflowTemplate = createWorkflowTemplate(workflowTemplateCode,workflowTemplateName);
List workflowActionTemplateList = createWorkflowActions(workflowTemplate, ACTION_PLAN);
List workflowDecisionTemplateList = createWorkflowDecisions(DECISION_PLAN);
createWorkflowInstance();
}
def createWorkflowTemplate(workflowTemplateCode,workflowTemplateName)
{
WorkflowTemplateModel workflowTemplate = modelService.create(WorkflowTemplateModel.class);
workflowTemplate.setOwner(userService.getUserForUID("admin"));
workflowTemplate.setCode(workflowTemplateCode);
workflowTemplate.setName(workflowTemplateName, Locale.ENGLISH);
modelService.save(workflowTemplate);
return workflowTemplate;
}
def createWorkflowActions(workflowTemplate, ACTION_PLAN)
{
//action code | action name | action user | action type | jobHandler
//create list of WorkflowActionTemplateModel
workflowActionTemplateList = [];
def actions = ACTION_PLAN.split("\n");
for (String action : actions)
{
//if action is not blank
if(action.isBlank())
{
continue;
}
def actionDetails = action.split("\\|");
workflowActionTemplate = null;
if(actionDetails.length > 4 && actionDetails[4] != null && !actionDetails[4].isBlank())
{
workflowActionTemplate = modelService.create(AutomatedWorkflowActionTemplateModel.class);
}
else
{
workflowActionTemplate = modelService.create(WorkflowActionTemplateModel.class);
}
workflowActionTemplate.setOwner(userService.getUserForUID("admin"));
workflowActionTemplate.setCode(actionDetails[0].trim());
workflowActionTemplate.setName(actionDetails[1], Locale.ENGLISH);
workflowActionTemplate.setPrincipalAssigned(userService.getUserForUID(actionDetails[2]));
workflowActionTemplate.setActionType(WorkflowActionType.valueOf(actionDetails[3]));
workflowActionTemplate.setWorkflow(workflowTemplate);
//actionDetails[3] is not blanck then set jobHandler
if(actionDetails.length > 4 && actionDetails[4] != null && !actionDetails[4].isBlank())
{
workflowActionTemplate.setJobHandler(actionDetails[4]);
}
modelService.save(workflowActionTemplate);
workflowActionTemplateList.add(workflowActionTemplate);
}
return workflowActionTemplateList;
}
def createWorkflowDecisions(DECISION_PLAN)
{
//decision code | decision name | origin action for this decision
//create list of WorkflowDecisionTemplateModel
List workflowDecisionTemplateList = new ArrayList();
def decisions = DECISION_PLAN.split("\n");
for (String decision : decisions)
{
if(decision.isBlank())
{
continue;
}
def decisionDetails = decision.split("\\|");
WorkflowDecisionTemplateModel workflowDecisionTemplate = modelService.create(WorkflowDecisionTemplateModel.class);
workflowDecisionTemplate.setOwner(userService.getUserForUID("admin"));
workflowDecisionTemplate.setCode(decisionDetails[0].trim());
workflowDecisionTemplate.setName(decisionDetails[1], Locale.ENGLISH);
println decisionDetails[0]+' source action > '+decisionDetails[2];
workflowDecisionTemplate.setActionTemplate(workflowActionTemplateList.find { it.code == decisionDetails[2] });
def targetActionModels = findAllTargetActionsForDecision(decisionDetails[0]);
workflowDecisionTemplate.setToTemplateActions(targetActionModels);
modelService.save(workflowDecisionTemplate);
workflowDecisionTemplateList.add(workflowDecisionTemplate);
}
return workflowDecisionTemplateList;
}
def findAllTargetActionsForDecision(decisionCode)
{
//decision code | target next action for this decision
def links = WORKFLOW_LINK.split("\n");
def targetActions = new ArrayList();
for (String link : links)
{
def linkDetails = link.split("\\|");
if(linkDetails[0] == decisionCode)
{
targetActions.add(linkDetails[1]);
}
}
def targetActionModels = [];
targetActionModels = targetActions.collect { targetAction ->
WorkflowActionTemplateModel foundModel = workflowActionTemplateList.find { it.getCode() == targetAction }
if (foundModel == null) {
throw new RuntimeException("No model found with the code: ${targetAction}")
}
return foundModel
}
targetActionModels.removeAll([null]);
return targetActionModels;
}
def createWorkflowInstance()
{
WorkflowTemplateModel workflowTemplate = workflowTemplateService.getWorkflowTemplateForCode(workflowTemplateCode);
catalog = catalogVersionService.getCatalogVersion('apparelProductCatalog', 'Online');
ProductModel product = productService.getProduct(catalog,"300618506");
WorkflowModel workflow = newestWorkflowService.createWorkflow("prodPriceWorkEx1",workflowTemplate, Collections. singletonList(product),userService.getUserForUID("admin"));
workflowProcessingService.startWorkflow(workflow);
}
La API de Workflow de SAP Commerce es una herramienta poderosa para las empresas que buscan optimizar operaciones y proporcionar una experiencia de compra integrada y eficiente. Al automatizar procesos complejos y asegurar la consistencia en cada etapa, esta solución es esencial para los líderes empresariales que desean mantener una ventaja competitiva en el mercado digital.
Sobre Digiu Digital
Digiu Digital se especializa en transformación digital y comercio electrónico, con amplia experiencia en soluciones SAP Customer Experience. Ofrecemos soporte 24/7 y un equipo de expertos globales para asegurar que su negocio se mantenga a la vanguardia.