Obtener el nombre del workflow padre con ParentContext

Cuando desplegamos un plugin o un workflow en nuestra instancia de CRM Dynamics estamos activando un flujo de trabajo que se ejecutará ante un determinado evento. En el caso del workflow podemos configurar mediante el menú de edición de Dynamics unas condiciones extra que se deben de dar para que se ejecute el código –como podría ser que determinado campo del registro modificado esté valorizado-.

Podría darse el caso de que este registro del que hablamos sea modificado por el usuario mediante un formulario de CRM, y además también podría ser modificado mediante la ejecución de otro workflow o plugin de, por ejemplo, actualización de datos nocturnos. Y rizando el rizo podemos suponer que un workflow puede llamar a otro, y este a otro, y así repetidas veces, pudiendo encontrar problemas si no controlamos bien el contexto en el que se ejecuta nuestro código.

En la ejecución de un Workflow o plugin siempre podemos obtener el objeto Context que vendrá heredado y que contendrá información sobre la profundidad –accesible mediante la propiedad Depth del objeto- además de otros parámetros de interés.

Cuando la profundidad es igual o mayor a uno implica que la ejecución de nuestro código ha sido invocada desde otro workflow o plugin. Cuando esto ocurre,  podremos acceder al ParentContext que será un objeto del mismo tipo pero que contendrá información del contexto del workflow que precede al nuestro que incluso podría darse el caso de que sea el mismo workflow.

La idea es poder obtener el nombre literal de ese workflow padre para poder poder condicionar la ejecución de nuestro workflow mediante un if.

Nombre literal del workflow en la entidad "Trabajos del sistema"

Nombre literal del workflow en la entidad “Trabajos del sistema”

Como hemos dicho, el ParentContext contiene información del contexto del workflow invocador de nuestro workflow, y entre otros datos contiene el parámetro CorrelationId que sería el id único del registro de tarea del sistema creado por este workflow. Con este id seremos capaces de obtener el nombre de éste workflow y condicionar la ejecución, como se indica en el siguiente ejemplo:

Parametros que se envian a Web Resource desde formulario

Cuando creamos un Web Resource desde el menú de edición del formulario de la entidad, podemos configurar que se envíen parámetros al mismo en la iniciación del formulario. Esto se consigue marcando la casilla “Pasar código tipo de objeto de registro e id. Único como parámetros”.

Configuración de Web Resource para pasar parámetros desde el formulario

Configuración de Web Resource para pasar parámetros desde el formulario

Cuando tenemos esta casilla activada durante la carga del Web Resource en nuestro formulario se invocará la URL y se añadirán algunos parámetros del contexto donde se está abriendo ese Web Resource. Esto es algo bueno puesto que mediante este contexto de información podremos desarrollar un Web Resource personalizado, por ejemplo, para el cliente que se esté viendo en ese momento.

Los parámetros que se envían por defecto cuando seleccionamos esta casilla son los siguientes:

# Parámetro Descripción
1 OrgLCID Id del código de lengua de la organización
2 UserLCID Id del código de lengua del usuario
3 Id Id del registro que estamos cargando
4 Orgname Nombre de la organización
5 Type Tipo de formulario.  0 = Undefined, 1 = Create, 2 = Update, 3 = Read Only, 4 = Disabled, 5 = Quick Create, 6 =  Bulk Edit, 11 = Read Optimized
6 Typename Nombre de la entidad donde se ha abierto el WR

Un ejemplo de URL completa para nuestro sería el siguiente:

new_prueba_web_resource?OrgLCID=3082&UserLCID=3082&id={42DCC3D2-7339-E611-80D6-C4346BAC8D78}&orgname=NuestraOrganizacion&type=2&typename=contact

El modo en el que podemos capturar estos parámetros desde nuestro javascript se ha indicado ya en este post antiguo. En este caso el proceso sería similar.

CRM también nos permite enviar parámetros personalizados introduciéndolos en el cuadro de texto que está encima del check indicado con anterioridad, en las propiedades del Web Resource. Si fuese este el caso, estos parámetros se enviarán a continuación de los ya indicados.

Podéis ver los parámetros que se han enviado a un Web Resource fácilmente con la extensión HUDCRM.

Obtener parámetros de carga de un web resource desde HUDCRM

Obtener parámetros de carga de un web resource desde HUDCRM

Variable window.IsUSD = true que introduce USD sobre el header

Una de las funcionalidades que más destaca del Unified Service Desk es la integración nativa con los formularios de CRM mediante la navegación a una URL de nuestra instancia. Además de esto, el USD nos permite por lo general navegar a cualquier otra dirección que deseemos mediante la UIIAction Navigate. Esto nos permitirá abrir aplicaciones web externas dentro de nuestro USD. ¿Es posible desde una aplicación web saber si la navegación se ha producido dentro de una pestaña del USD? La respuesta es sí: mediante la variable window.IsUSD.

El Unified Service Desk se toma la molestia de introducir en el Header de cada web que se carga un pequeño fragmento de código Javascript como el siguiente:

 

 

De modo que mediante el acceso a esta variable podremos saber si nuestra aplicación web -o nuestro Web Resource incrustado en un formulario de CRM- ha sido visitada desde un USD.

Variable IsUSD en el Header de Google

Variable IsUSD en el Header de Google

 

En el caso de que estemos navegando sobre un formulario de CRM, el USD también incluirá esta variable en el Header de los Iframes que contiene (Iframes normales o Webresources).

Variable IsUSD en el Header de Bing abierto en un Iframe de un formulario CRM

Variable IsUSD en el Header de Bing abierto en un IFrame de un formulario CRM

 

Variable IsUSD en el Header de un Web Resource de un formulario CRM

 

Pero, ¿en qué situaciones podríamos aprovecharnos de este hecho?

Las razones por las cuales necesites saber si un USD ha abierto tu aplicación web pueden ser muchas, pero existe un gran motivo por el cuál esa variable está ahí.

De modo nativo, el USD nos avisa de eventos generados en cualquier formulario. Un ejemplo sería un evento OnSave de un formulario. Este evento se envía al USD y éste lo recibe pudiendo generar con él una Action Call que derive en cualquier otra acción o ejecución de código. El método que utiliza CRM para “avisar” al USD de que en el formulario se ha producido un evento de guardado es mediante la ejecución de un comando Javascript del tipo:

 

Cuando el USD detecta que queremos navegar a una web del dominio event lo interpretará como que esa página web le está avisando de un evento y no realizará la navegación.

Y aquí está la clave de la variable IsUSD. Si incluimos una linea como la anterior en un Web Resource y abrimos el formulario desde un navegador y no desde el USD, el navegador ejecutará esa orden produciendo que la página navegue a esa “URL”. El resultado será que nuestro navegador nos abrirá una ventana de una página web totalmente ajena a nuestro proyecto y que por supuesto mostrará publicidad de cualquier tipo.

Esta aquí uno de los motivos por los cuales Microsoft ha incluido esta funcionalidad de inyectar sobre cualquier web una variable que nos avise de que la navegación se está produciendo desde USD y no desde otro navegador. Mediante la verificación de esta variable podremos ahorrarnos ejecutar esa orden de evento si la navegación está fuera del USD añadiendo a nuestro código la siguiente comprobación:

Con ello podremos controlar este hecho en nuestras aplicaciones web

Navegando en el mismo formulario con y sin USD

Navegando en el mismo formulario con y sin USD

 

Web Resources dinámicos: Pasar y recibir parámetros

Los Web Resources son elementos que se sitúan en los formularios y que dan libertad al desarrollador de introducir páginas webs externas dentro del contexto de un formulario de CRM. Son muy útiles puesto que a menudo el alcance de un formulario de CRM se queda corto para implementar soluciones específicas que cumplan los requerimientos del cliente.

Con el Web Resource podemos introducir lógica propia a un formulario, interactuar con el formulario o con el resto del CRM mediante código Javascript. Una de las cosas buenas que tiene CRM es que podemos crear un HTML flexible, subirlo como un Web Resource y utilizarlo en distintos formularios de entidades. Además como veremos a continuación podemos incluir parámetros de entrada en cada uno de los Web Resources que insertemos para personalizar el contenido.

Lo primero que tenemos que hacer es preparar el HTML que formará el Web Resource. Recordad que a CRM se pueden subir Web Resources con los siguientes formatos:

Tipos de Web Resources permitidos CRM

Para el ejemplo crearemos una web en HTML con algunas funciones Javascript. En particular la idea para empezar es crear una web que en función del parámetro que se le pase cambie el color del fondo del HTML.

En el ejemplo tenemos dos funciones: la primera cambiarColorFondo(color) establece el color de fondo de la página que se le pase por parámetro (con formato #AABBCC).

La segunda, parametrosGet() obtendrá la lista de parámetros que se pasen al Web Resource y los recorrerá uno a uno comprobando el nombre y el valor. Cuando el nombre sea igual a color se ejecutará el cambio de color de fondo con el valor pasado por parámetro.

Al final del código Javascript ejecutamos la función parametrosGet() para comenzar el proceso en el OnLoad de la página.

Una vez escrito el código lo subimos a la solución como Web Resource de tipo Webpage (HTML) y publicamos.

Una vez hecho esto ya podemos insertar nuestra web dinámica en cualquier formulario de CRM. Para ello editamos el formulario de cualquier entidad y accedemos a Insertar -> Web resource. La configuración de nuestro Web Resource deberá parecerse a la de la imagen:

Propiedades Web Resource

En la casilla Web Resource debemos seleccionar nuestro HTML que deberemos haber subido previamente. Es importante seleccionar el Check “Pass record object-type code and unique identifier as parameters”. Con esto nos garantizamos que el parámetro se transfiere a nuestra web para poder capturarlo con la función parametrosGet().

Finalmente personalizamos los “Custom Parameters(data)” con el color que deseemos. Si se deseasen incluir más parámetros la estructura que debería seguir esta cadena sería param1=valor1&param2=valor2&param3=valor3

Si insertamos varios Web Resources en nuestro formulario personalizando cada uno con un color distinto obtendríamos lo siguiente:

Web Resources dinámicos en un mismo formulario

Aunque el cliente nunca nos pedirá una web con distintos colores de fondo, este ejemplo nos muestra cómo reutilizar un mismo Web Resource para distintos entornos o formularios. Las posibilidades son infinitas y aún se multiplican más cuando el parámetro que se envía es el ID del registro de CRM. Este ejemplo lo explicaremos en otra entrada del blog.