Sunday, May 27, 2012

Check User Roles

Checking user role is a common requirement in MS CRM application. Here is the code using oData query.


//Get user roles

CustomcheckSecurityRole: function () {

    //Getting the user id of the logged in user 
    var user = Xrm.Page.context.getUserId();
    var loggedInUserId = user.substring(1, 37);
    flag = false;

    //Getting the roles of logged in user
    var odataSelect = "/SystemUserSet?$select=systemuserroles_association/Name,systemuserroles_association/RoleId&$expand=systemuserroles_association&$filter=SystemUserId eq guid'" + loggedInUserId + "'";

    var requestResults = GetEntityData(odataSelect);

    var roleName = ""; 

    //Comparing the roles of logged in user,If Display Role or Read All User is present return false

    for (var i = 0; i < requestResults.results[0].systemuserroles_association.results.length; i++) {
        roleName = requestResults.results[0].systemuserroles_association.results[i].Name; 
        if (roleName.toString() != "System Administrator")
        {
            flag = true;
        } 
    }
    return (flag);
}
//Get entity data. It requires oData query.
GetEntityData :function(OData) {
    var serverURL = getServerUrl();
    var oDataEndpointUrl = serverURL + "/XRMServices/2011/OrganizationData.svc";
    oDataEndpointUrl += OData;
    var service = GetRequestObject(); 

    if (service != null) {
        service.open("GET", oDataEndpointUrl, false);
        service.setRequestHeader("X-Requested-Width", "XMLHttpRequest");
        service.setRequestHeader("Accept", "application/json, text/javascript, */*");
        service.send(null);
        var requestResults = eval('(' + service.responseText + ')').d;

        if (requestResults != null)
            return requestResults;
        else
            return null;
    }
}


GetRequestObject: function () {
        if (window.XMLHttpRequest) {
            return new window.XMLHttpRequest;
        }
        else {
            try {
                return new ActiveXObject("MSXML2.XMLHTTP.3.0");
            }
            catch (ex) {
                return null;
            }
        }
    } 

getServerUrl: function {

       var customServerURL = document.location.protocol + "//" + document.location.host + "/" + Xrm.Page.context.getOrgUniqueName();
       return customServerURL;

      }
How to read Unsecure Configuration

In MS CRM plugin, reading some configration setting/constant is a common requirement . Through Unsecure configuration we can easily achieve this.


Add below configuration xml in unsecure configuration section of appropirate step in plugin registration tool.


<|?xml version="1.0" encoding="utf-8" ?|>
<|Settings>
  <|setting name="ReportExc_ReportExecutionService"|>
    <|value>http://localhost/ReportServer/ReportExecution2005.asmx<|/value>
  <|/setting>
  <|setting name="Unique_Organization">
    <|value>Contoso<|/value>
  <|/setting>
<|/Settings>


Read the configration xml from Plugin
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using Microsoft.Xrm.Sdk;
namespace UnsecureConfig
{
    public class PlugInCreate:IPlugin
    {
         private XmlDocument _pluginConfiguration;
         public PlugInCreate(string unsecureConfig, string secureConfig)
         {
             if (string.IsNullOrEmpty(unsecureConfig))
             {
                 throw new InvalidPluginExecutionException("Unsecure configuration missing.");
             }
             _pluginConfiguration = new XmlDocument();
             _pluginConfiguration.LoadXml(unsecureConfig);
         }
         public void Execute(IServiceProvider serviceProvider)
         {
             // Obtain the execution context from the service provider.
             IPluginExecutionContext context =
                 (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); 
             // Get a reference to the organization service.
             IOrganizationServiceFactory factory =
                 (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
             IOrganizationService service = factory.CreateOrganizationService(context.UserId); 
             // Get a reference to the tracing service.
             ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
             if (tracingService == null)
                 throw new InvalidPluginExecutionException("Failed to retrieve the tracing service.");

             string reportUrl = GetConfigDataString(_pluginConfiguration, "ReportExc_ReportExecutionService");
         }
         public static string GetConfigDataString(XmlDocument doc, string label)
         {
             return GetValueNode(doc, label);
         }
         private static string GetValueNode(XmlDocument doc, string key)
         {
             XmlNode node = doc.SelectSingleNode(String.Format("Settings/setting[@name='{0}']", key));
             if (node != null)
             {
                 return node.SelectSingleNode("value").InnerText;
             }
             return string.Empty;
         }
    }
}

Wednesday, May 23, 2012

Copy data from other Opportunity to new Opportunity


// Add a button on opportunity form. Add this file as web resource and call the function copyFromOpportunity on button action
var serverUrl = null;
serverUrl = Xrm.Page.context.getServerUrl();


//The XRM OData end-point
var ODATA_ENDPOINT = "/XRMServices/2011/OrganizationData.svc";


function copyFromOpportunity() {
  
    retrieveRecord("Opportunity Lookup View", "SavedQuerySet", retrieveViewCompleted, null);


}


function retrieveOpportunity(id) {


    retrieveRecord(id, "opportunitySet", retrieveOpportunityCompleted, null);
}


function retrieveViewCompleted(data, textStatus, XmlHttpRequest) {


    var view = data[0];


    var viewId = view.SavedQueryId;


    if (viewId == null) {
        alert('null: setting value');
       
    }


    var queryStringParams = Xrm.Page.context.getQueryStringParameters();


    var etc = 0;


    for (var item in queryStringParams) {
        if (item == 'etc') {


            etc = queryStringParams[item];
            break;
        }
    }
    var customer = new Array();


    customer = Xrm.Page.getAttribute('customerid').getValue();


    var customerId = customer[0].id;


    var viewUrl = serverUrl + '/_controls/lookup/lookupinfo.aspx?AllowFilterOff=1&DefaultType=' + etc + '&DefaultViewId=' + viewId + '&DisableQuickFind=0&DisableViewPicker=1&LookupStyle=single&ShowNewButton=0&ShowPropButton=1&browse=0&objecttypes=' + etc;


    // alert(viewUrl);


    var retVal = window.showModalDialog(viewUrl, "", "width=900px,height=600px,resizable=1");


    if (retVal != null) {
        var kpLookup = retVal.items;
        retrieveKeyPlayer(kpLookup[0].id);
    }
}


function retrieveOpportunityCompleted(data, textStatus, XmlHttpRequest) {


    var opportunity = data;


    var opportunityName = opportunity.name;
 
    var customerLookup = new Array();
    if (opportunity.customerId.Id != null) {
        customerLookup[0] = new Object();
        customerLookup[0].id = opportunity.customerId.Id;
        customerLookup[0].name = opportunity.customerId.Name;
        customerLookup[0].entityType = 'account';


    }


    Xrm.Page.getAttribute('name').setValue(name);
    Xrm.Page.getAttribute('customerId').setValue(customerLookup);
// Setrequired fields values
}


function errorFromCallback(XmlHttpRequest, textStatus, error) {
    alert('error: ' + error);
}


function retrieveRecord(id, odataSetName, successCallback, errorCallback) {

    if (!id) {
        alert("record id is required.");
        return;
    }

    if (!odataSetName) {
        alert("odataSetName is required.");
        return;
    }
    if (odataSetName == 'opportunitySet') {
        $.ajax(
        {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "(guid'" + id + "')",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.            
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    successCallback(data.d, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    }
    else if (odataSetName == 'SavedQuerySet') {
        //alert("SavedQuerySet");
        $.ajax(
        {
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?$filter=Name eq '" + id + "'",
            beforeSend: function (XMLHttpRequest) {
                //Specifying this header ensures that the results will be returned as JSON.            
                XMLHttpRequest.setRequestHeader("Accept", "application/json");
            },
            success: function (data, textStatus, XmlHttpRequest) {
                if (successCallback) {
                    //alert(serverUrl + ODATA_ENDPOINT + "/" + odataSetName + "?$filter=Name eq '" + id + "'");
                    successCallback(data.d.results, textStatus, XmlHttpRequest);
                }
            },
            error: function (XmlHttpRequest, textStatus, errorThrown) {
                if (errorCallback)
                    errorCallback(XmlHttpRequest, textStatus, errorThrown);
                else
                    errorHandler(XmlHttpRequest, textStatus, errorThrown);
            }
        });
    }
}