Iniciar Flujos de Trabajo Programáticamente

Recientemente me ha surgido la necesidad de disparar un determinado Flujo de Trabajo desde código. No es muy difícil encontrar información pero me ha parecido bien recopilar en el código que a continuación les mostraré como hacerlo de forma sencilla. Un código que nos permitirá incluirla en distintos tipos de soluciones para SharePoint. Por ejemplo podríamos incluirla como parte de una actividad de SharePoint Designer siguiente los pasos que indicaba en la entrada que habría este blog.

Vamos a pasar sin más a ver el código que nos va a permitir ejecutar programáticamente un flujo de trabajo.

using (SPSite site = new SPSite(context.CurrentWebUrl))
{
      using (SPWeb web = site.OpenWeb())
      {
           //Obtenemos el item de la lista actual, para ello se obtiene la lista actual a partir de su Id y despues se accede al item
           SPList list = web.Lists[new Guid(ListId)];
           SPListItem listItem = list.GetItemById(ListItem);

           //Indicamos el Flujo de trabajo con el que queremos asociar el Item Actual y disparamos dicho flujo de trabajo
           SPWorkflowAssociation associationTemplate = list.WorkflowAssociations.GetAssociationByName(Tipo.ToString(), new System.Globalization.CultureInfo(Convert.ToInt32(list.ParentWeb.RegionalSettings.LocaleId)));
           site.WorkflowManager.StartWorkflow(listItem, associationTemplate, associationTemplate.AssociationData);

       }
}

Los aspectos más importantes de este código son las líneas 10 y 11. En ellas encontramos las funciones que hay que emplear para lanzar un flujo de trabajo. Para ello utilizamos el método GetAssociationByName para obtener un objeto del tipo SPWorkflowAssociation que nos va a permitir asociar el flujo de trabajo que deseemos con el Item de la lista que hayamos cargado inicialmente. Este método tiene dos parámetros, el primero, el nombre del flujo de trabajo que queremos ejecutar y el segundo, un parámetro del tipo CultureInfo para indicar los parámetros regionales.

Tras esto en la línea 11 disparamos el flujo de trabajo usando StartWorkflow tal y como vemos. Indicaremos como parámetros el item de la lista sobre el que queremos lanzar el flujo de trabajo, el objeto que referencia al Flujo de trabajo del tipo SPWorkflowAssociation y por último los datos de asociación de ese flujo de trabajo por medio del miembro AssociationData del objeto del tipo mecionado anteriormente.

De esta manera se puede iniciar programáticamente un flujo de trabajo dentro de un sitio determinado.