Digiu Digital

SAP Commerce

Mejorando la Eficiencia del Comercio Electrónico con la API de Workflow de SAP Commerce

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<WorkflowActionTemplateModel> workflowActionTemplateList = createWorkflowActions(workflowTemplate, ACTION_PLAN);
    List<WorkflowDecisionTemplateModel> 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<WorkflowDecisionTemplateModel> workflowDecisionTemplateList = new ArrayList<WorkflowDecisionTemplateModel>();

    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<String>();
    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.<ItemModel> 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.