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:

No hay comentarios:

Publicar un comentario