27 de julio de 2008

Ejemplo de workflow con SharePoint Designer

SharePoint Designer (SPD) es una versión evolucionada de FrontPage, que a sus nuevas capacidades de diseño de sitios web, añade funcionalidades específicas de SharePoint, la herramienta de colaboración para grupos de trabajo de Microsoft.

Normalmente, los entornos de colaboración Web requieren de conocimientos de programación para desarrollar pequeñas utilidades (avisar a varios usuarios para que revisen un documento, aprobar un documento…) que si bien no son imprescindibles, simplifican el trabajo y ayudan a tener procedimientos conocidos y usados por todos.

Es decir, que no se implantan nunca, porque la relación aparente coste/beneficio suele ser pequeña y “total, con el correo electrónico y un par de añadidos, te lo haces…”.

SPD es una herramienta que permite que usuarios no programadores puedan crear flujos de trabajo muy sofisticados.

Esto no pretende ser un curso de SPD o workflows, sino un ejemplo de una cosilla que he hecho (queda un poco rara fuera del entorno en que se plantea, pero en cualquier caso, aquí queda). Es muy recomendable empezar con uno básico, que funcione de principio a fin, y luego empezarr a enredar con las diferentes acciones.

Introduzcamos unos términos:

  • Paso: cada una de las secuencias que compone un workflow, puede haber varias, y podemos elegir que se ejecuten en serie (una detrás de otra) o en paralelo (todas a la vez, por ejemplo, si queremos esperar a que varias personas aprueben un documento, y tenemos que comprobar si hay quorum cada vez que alguen lo aprueba.
  • Condición: Cada paso, parte de una condición opcional, que pregunta si el paso se realiza o no, en función de una pregunta
  • Acciones: las tareas que se ejecutarán si la condición de un paso es cierta, pueden ser varias encadenadas
  • Variables de inicio: unas variables que el workflow pedirá al iniciarse. Pueden ser texto, fecha/hora, número o enumeraciones
  • Variables: otras que definimos en el procesamiento del workflow para nuestras necesidades

Objetivo

Queremos automatizar mínimamente la gestión de citas de un servicio. En una lista de SharePoint, tenemos las solicitudes de cita, que básicamente tienen nombre y email de contacto, además de unos campos de estado y control. A esta lista, asociaremos el workflow

Además, tenemos además un calendario en el que se apuntan las citas

  • Cada cita tiene una referencia que apunta a su solicitud (un campo Lookup de SharePoint)
  • Cada solicitud mantiene una referencia a la última cita propuesta

image

Nuestro workflow hará lo siguiente:

  • Pedirá la fecha/hora de la cita y la duración
  • Hará unas comprobaciones
  • Apuntará la cita en el calendario
  • Enviará un email personalizado con los datos de la cita
  • De la misma forma, podemos hacer otros para modificar o cancelar una cita

Evidentemente, esto no es una aplicación de gestión de calendario, pero nos puede quitar bastante trabajo rutinario. Veamos los pasos más importantes.

Inicio

Pedimos dos variables, la fecha/hora de la cita y su duración. La duración se pide como un campo enumerado, con opciones.

image

image

Comprobaciones iniciales

Unas comprobaciones básicas para ver si la fecha de cita es anterior a “Hoy”, en este caso:

  • Usamos la acción “Definir campo en el elemento actual” para rellenar en el campo Avisos (un campo de texto asociado a la solicitud) con el texto “Fecha cita incorrecta”
  • Detenemos el workflow y cambiamos su estado de terminación a “Fecha cita incorrecta”

image

Definiciones de variables

  • Usamos la acción “agregar hora a fecha” para calcular la fecha fin de la cita sumando la duración a la hora de inicio
  • Incrementamos en 1 el contador de citas del solicitante
  • Usamos la acción “generar cadena dinámica” para generar el título de la entrada en el calendario (solicitante+número de cita) y un campo nombreunicocalendario (solicitante+fechacreaciónsolicitud+numero de cita) que usaremos para vincular solicitudes y citas

image

Comprobar si la hora está libre

Este es uno de los puntos débiles de SPD, no podemos comprobar si un rango de tiempo en el calendario tiene citas. Lo único que haremos es ver si una cita empieza a la misma hora que la nuestra.

image

Usamos la condición “Comparar cualquier origen de datos” para buscar un elemento en la lista “calendario” cuya hora de inicio sea igual a la variable “Fecha Cita”. Si es igual, paramos el workflow con un error.

image

Crear entrada de calendario

Como todo ha ido bien, creamos la entrada en el calendario, definiendo todos los campos del calendario con datos que sacamos de la solicitud de cita. Como elemento importante, guardamos en una variable nueva el resultado de crear esta entrada de calendario. Esta variable contendrá el Id del item de calendario creado, que usaremos más adelante.

image

image

Actualizar estado de la solicitud

Ahora registramos en la solicitud que todo ha ido bien. Parar ello, cambiamos varios campos de la solicitud (estado, fecha de cita y número de cita (un contador que se incrementa en cada paso). Además, aprovechamos el campo Id del elemento de calendario creado para asignárselo al campo CitaRelacionada, que almacena un campo búsqueda sobre la lista de calendario.

image

Enviar email

Esto no tiene ningún misterio, SPD tiene una actividad que permite enviar emails personalizado. Sin embargo, esta actividad tiene una limitación, que no es posible cambiar el ‘Remitente’ del correo. Para solventar este problema, hemos usado una acción personalizada disponible en Codeplex, SPD custom workflow activities.

image

Eliminar una cita

Este workflow es muy similar al anterior. Usando la capacidad de búsqueda sobre el calendario, con el campo de referencia única que hemos creado, localizamos una entrada de calendario que tenga la referencia de la última cita. Si existe, la eliminamos, buscamos además la cita anterior, y asignamos el campo de cita relacionada al Id de esta entrada. Actualizamos el contador de citas en la solicitud y notidicamos los cambios por email.

Y esto es todo… espero que a alguien le sirva como idea para aprovechar estas capacidades y automatizar tareas rutinarias en la colaboración con documentos y elementos de Sharepoint.

2 comentarios:

Mr. Carbón dijo...

Gracias por su artículo.

Cuál versión de Sharepoint y Sharepoint Designer se usó para el artículo?

Luis Romero dijo...

Estas capturas son de las versiones 2007 de ambos productos, pero algo parecido se puede hacer con la versión 2010. La versión 2013 cambia un poco el aspecto y añade más capacidades.