sábado, 19 de julio de 2014

Botón para reactivar Citas desde la barra de comandos

Una de las cosas que mas me gustan de colaborar en las comunidades de Dynamics CRM, es que cada día aprendo cosas nuevas.

Y cuando digo cada día, es CADA DÍA! hace poco me han comentado que las actividades podrían ser reabiertas, y esto es algo que antiguamente no se podía hacer, pero que en algún momento de las releases, rollups, etc. lo han abierto.

Esta funcionalidad abre un montón de nuevas oportunidades, como por ejemplo que se puedan reabrir actividades desde workflows.

En este caso, lo que voy a hacer es crear un botón en el “Command bar” para reactivar una Cita ya cerrada.

Para esto lo primero que tengo que hacer es añadir el botón en ese menú con el Ribbon Workbench :

image

La configuración del botón sería la siguiente:

image

El comando a llamar sería una función de Javascript llamada “Activar”:

image

La regla de visualización y activación del botón estarán relacionadas al estado del registro, en este caso, solamente se mostrará cuando el registro este desactivado (Completado):

image

Publicamos, y de esta manera ya tenemos un nuevo botón relacionado con Citas completadas (en el formulario).

Por otra parte, tengo un WebResource (new_actividad.js de javascript) con el siguiente código:

function Activar(Id)
{
   var EntityName="appointment";
   var State="3";
   var Status="5";
  
   
    SetStateRequest(EntityName, Id, State, Status);
 
    window.location.reload(true);

}

function SetStateRequest (_entName,_entId,_state, _status) {
    var requestMain = ""
    requestMain += "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">";
    requestMain += "  <s:Body>";
    requestMain += "    <Execute xmlns=\"http://schemas.microsoft.com/xrm/2011/Contracts/Services\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">";
    requestMain += "      <request i:type=\"b:SetStateRequest\" xmlns:a=\"http://schemas.microsoft.com/xrm/2011/Contracts\" xmlns:b=\"http://schemas.microsoft.com/crm/2011/Contracts\">";
    requestMain += "        <a:Parameters xmlns:c=\"http://schemas.datacontract.org/2004/07/System.Collections.Generic\">";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>EntityMoniker</c:key>";
    requestMain += "            <c:value i:type=\"a:EntityReference\">";
    requestMain += "              <a:Id>" + _entId + "</a:Id>";
    requestMain += "              <a:LogicalName>" + _entName + "</a:LogicalName>";
    requestMain += "              <a:Name i:nil=\"true\" />";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>State</c:key>";
    requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain += "              <a:Value>" + _state + "</a:Value>";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "          <a:KeyValuePairOfstringanyType>";
    requestMain += "            <c:key>Status</c:key>";
    requestMain += "            <c:value i:type=\"a:OptionSetValue\">";
    requestMain += "              <a:Value>" + _status + "</a:Value>";
    requestMain += "            </c:value>";
    requestMain += "          </a:KeyValuePairOfstringanyType>";
    requestMain += "        </a:Parameters>";
    requestMain += "        <a:RequestId i:nil=\"true\" />";
    requestMain += "        <a:RequestName>SetState</a:RequestName>";
    requestMain += "      </request>";
    requestMain += "    </Execute>";
    requestMain += "  </s:Body>";
    requestMain += "</s:Envelope>";
    var req = new XMLHttpRequest();
    req.open("POST", _getServerUrl(), false)
    // Responses will return XML. It isn't possible to return JSON.
    req.setRequestHeader("Accept", "application/xml, text/xml, */*");
    req.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
    req.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute");
    var successCallback = null;
    var errorCallback = null;
    req.onreadystatechange = function () { SetStateResponse(req, successCallback, errorCallback); };
    req.send(requestMain);
}

function SetStateResponse   (req, successCallback, errorCallback) {
    if (req.readyState == 4) {
        if (req.status == 200) {
            if (successCallback != null)
            { successCallback(); }
        }
        else {
          
        }
    }
}
function _getServerUrl   () {
    var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
    var serverUrl = "";
    if (typeof GetGlobalContext == "function") {
        var context = GetGlobalContext();
        serverUrl = context.getServerUrl();
    }
    else {
        if (typeof Xrm.Page.context == "object") {
            serverUrl = Xrm.Page.context.getServerUrl();
        }
        else
        { throw new Error("Unable to access the server URL"); }
    }
    if (serverUrl.match(/\/$/)) {
        serverUrl = serverUrl.substring(0, serverUrl.length - 1);
    }
    return serverUrl + OrgServicePath;
}

Publicamos todo, y ahora voy a una Cita Completada:

image

Y haciendo “click” en el botón “Activar”, conseguimos reabrir la Cita:

image

La solución no administrada completa la dejo disponible para la descarga:

jueves, 17 de julio de 2014

Iconos de orígenes de Casos

Una de las nuevas funcionalidades o cambios en Dynamics CRM 2013 con el SP1, es la aparición (la vuelta) de los iconos en las vistas. En realidad no es igual que en versiones anteriores, sino que tienen un aspecto mas funcional ya da mas información acerca de los Casos.

Según el origen del Caso (Teléfono, Email, Web, Facebook, Twitter), no enseña en las vistas una imagen como se muestra en la siguiente tabla:

image

Lo que está buena de esta funcionalidad, es que nos permite además añadirle imágenes adicionales en caso de añadir nuevos valores en este campo (incident_caseorigincode).

Lo que hago entonces es añadir un nuevo valor “Otro” (con valor 100000000):

image

Luego me creo un nuevo icono como WebResource (.PNG) con el nombre “Incident_orgincode_icon100000000.png”. En el nombre se debe introducir en el lugar del “100000000” el número del picklist que se desea relacionar:

image

Luego vamos a los casos, y al primero le selecciono como “Origen” = Otro:

image

y en la vista se ve así:

image

un saludo!

miércoles, 9 de julio de 2014

Proyecto Siena con datos de Dynamics CRM Online

Hola a todos, no se estarán actualizados acerca de lo que voy a hablar hoy, pero es acerca del proyecto Siena.

Este proyecto es una solución de Microsoft, para permitir la creación de Apps en formato Modern UI, sin necesidad de desarrollar. Para mas información e instalarlo ir al store: http://apps.microsoft.com/windows/es-es/app/microsoft-project-siena/5ae47651-e8f3-4e41-aab7-e19ab1b80180

Hoy lo que intentaré mostrar es como utilizar Siena con datos de CRM, que aunque aún no hay conexión directa contra CRM Online, podemos encontrar un “Workaround” utilizando Excel. Es muy sencillo y los resultados desde mi punto de vista son geniales.

En el siguiente ejemplo, voy a mostrar datos de Cuentas de CRM en una app creada con Siena.

Voy a empezar exportando datos de mi CRM Online:

image

Luego abrimos el Excel, seleccionamos los datos y les damos formato de Tabla, ya que para Siena es un requerimiento darle este formato:

image

Luego debemos guardar el Excel como Excel de 2013 en formato xlsx:

image

Luego tenemos que instalarnos Siena, abrirlo:

image

Vamos a DataSources:

image

Desde aquí se pueden seleccionar diferentes orígenes de datos en este caso seleccionamos Excel:

image

Seleccionamos el Excel:

image

Importamos los datos:

image

y así tenemos los datos:

image

Seleccionamos una Galería para añadir:

image

De tipo Text Gallery:

image

Y seleccionamos la tabla anterior como origen de datos de la galería:

image

Finalmente damos al boton derecho, file->Publish:

image

Rellenamos la información para publicar y damos a publicar:

image

Seleccionamos una carpeta, aceptamos y luego estará publicado:

image

image

Entonces, en donde hemos definido la publicación, tenemos esto:

image

También se puede ejecutar un preview dando al boton derecho y ejecutarlo:

image

y así se ve nuestra app:

image

un saludo

viernes, 4 de julio de 2014

Workflows síncronos y Outlook en modo offline

Hola a todos, hoy hablaremos de una de esas funcionalidades que han mejorado considerablemente con CRM 2013. Esta no es otra que la posibilidad de ejecutar Workflows (flujos de trabajo) en tiempo real.

El tema es que no todo en Dynamics CRM es online o síncrono, y el principal ejemplo de esto, es la posibilidad de trabajar con Dynamics CRM de forma desconectada (offline mode).

El otro día se me cruzó por la cabeza que ocurre cuando estoy en modo desconectado desde el Outlook, y lanzo un proceso de estos en tiempo real. Entonces me planteé probarlo y escribir este artículo para compartir mis resultados.

En primer lugar me he creado un Workflow sencillo, síncrono que en las creaciones de cuentas, ponga en el campo “Teléfono” el valoe 666666666 como se muestra a continuación:

SNAGHTML14806b27

Entonces nos vamos a offline desde el Outlook:

image

Vamos a crear una nueva Cuenta y vemos que el workflow síncrono no se ha ejecutado ya que el campo de Teléfono no se ha actualizado:

image

Nos volvemos a conectar con CRM:

image

Y vemos que el workflow se ha ejecutado:

image

COMENTARIOS: Los workflow síncronos, son una maravilla, permiten que nuestros desarrollos necesarios en plugins sean menores, pero a diferencia de los Plugins, solo funcionan en el server side, y en el cliente de Outlook no se disparan cuando esta en offline.

Si queremos comprobar si este workflow en tiempo real se ha disparado desde un sitio u otro, lo que se me ocurre sería en el formulario de la entidad, añadir un campo, donde guardar el resultado de context.client.getClientState() y si es “offline”, entonces evitar que se ejecute nuestro plugin.

viernes, 13 de junio de 2014

Nuevas transiciones de estados en entidades (SP1)

Una de las nuevas funcionalidades del SP1 (LEO) es el tema de las transiciones de estados.

Esta funcionalidad solo se puede utilizar en la entidad de casos y en entidades personalizadas. El objetivo es sencillo, habilita la posibilidad de definir flujos de estados del campo “statuscode” o “Razón para el estado”.

A continuación enseñaré un ejemplo con una entidad personalizada para explicar como funciona.

En primer lugar me he creado una entidad de “Gastos":

image

A continuación, entro en el campo “StatusCode” y le personalizado unos estados activos por los que puede pasar (Borrador, Pendiente de aprobación de negocio y pendiente de aprobación del pago):

image

Y unos valores del estado inactivo (Aprobado o denegado):

image

Luego para definir el orden y la validación por los estados en que puede ir pasando esta entidad, debemos ir al siguiente enlace:

image

Una vez abierto, definimos el siguiente flujo de estados:

image

Luego añado el campo “Razon para el estado” en el formulario para probar como se comporta:

image

Publicamos y entramos al registro. Inicialmente los unicos dos estados disponibles son “Borrador” o “Pendiente de aprobación de negocio”:

image

Al seleccionar “Pendiente de aprobación de negocio” me aparecen disponible el siguiente estado:

image

Si desactivo el registro, queda en estado “Denegada”:

image

y no me permite volver a activar el registro y si lo intento me muestra el siguiente mensaje de error:

image

Si llevo el registro al estado “Pendiente de aprobación del pago” e intento desactivar el registro, como puede pasar a dos estados, en lugar de desactivarlo sin mas como en el caso anterior y dejarlo Denegado, me aparece una ventana donde seleccionar el estado de los disponibles al que lo quiero pasar:

image

CONCLUSION: La verdad que esto de las transiciones de estados, es algo que mediante javascripts y plugins (o las dos cosas), seguramente todos hayamos hecho en proyectos anteriores de CRM. Pero a partir de ahora, olvidaros de desarrollar esto ya que viene OOTB (Out Of The Box)!

un abrazo

martes, 3 de junio de 2014

Integración con Sharepoint basada en servidor (SP1)

Hoy voy a seguir publicando cosas nuevas de LEO (en realidad se llama Service Pack 1, pero a mi me sigue gustando llamarlo LEO).

Uno de los temas que si es totalmente nuevo y que no se ha podido probar antes hasta la publicación en real del SP1 es la sincronización con Sharepoint en el lado servidor.

Esta nueva funcionalidad que está disponible solamente para CRM Online (esperemos que esté disponible para onpremise también), lo que hace es sincronizarnos nuestro CRM con un gestor documental como Sharepoint Online. Cabe destacar que los dos sistemas (CRM y Sharepoint) deben estar registrados en la misma cuenta de Office 365.

Bien, pero si antes ya teníamos esto, ¿como funciona ahora?, la respuesta es simplemente MUCHO MEJOR. Hoy os voy a contar paso a paso como hacer funcionar, configurarlo y probarlo.

El cambio del enfoque es sencillo, y en el siguiente gráfico podemos ver que es lo que cambia con esto, que básicamente permite que el servidor de CRM se conecte directamente contra el Sharepoint:

image

Primero, al entrar en un CRM Online con SP1, nos aparecerá el siguiente mensaje:

image

Si le hacemos caso y hacemos click en “Habilitar ahora” nos muestra esta pantalla, donde hay que introducir la URL del Sharepoint:

image

En la siguiente pantalla tenemos un resumen de que todo esta ok:

image

Y finalmente una pantalla de confirmación:

image

Ahora hay que habilitar la gestión documental en CRM:

image

Entramos en la configuración de administración de documentos:

image

Y seleccionamos las entidades que queremos habilitar e introducimos la URL del Sharepoint:

image

Luego definimos la estructura a seguir para la gestión documental:

image

Nos aparece un mensaje de advertencia:

image

y Finalmente todo parece estar correcto:

image

Luego vamos a probarlo. Voy a una cuenta y dentro de lo relacionado con ella, abro los Documentos:

image

Si esta Cuenta no tiene ya creada su carpeta en Sharepoint, nos aparecerá esta ventana:

image

Luego desde CRM subimos un fichero:

image

image

Aquí podemos ver uno de los cambios principales, que es que los documentos de Sharepoint, se ven en CRM como si fuesen entidades normales de CRM. Antiguamente hacía falta verlos a través de un iframe.

image

Si vamos al Sharepoint, podemos confirmar que este documento esta disponible:

image

Probamos subir un fichero directamente en Sharepoint:

image

image

y Finalmente volvemos al CRM, y vemos que el nuevo documento también esta disponible:

image

La integración con Sharepoint de esta manera es simplemente EXCELENTE!

espero les haya sido útil!