Thursday, 18 July 2013

Gathering requirements @ MSCRM

Enterprise Microsoft Dynamics CRM implementations  Gathering requirements


Introduction
Gathering requirements and setting the right expectations is one of the areas which can make or break a Customer Relationship Management (CRM) implementation. When working with COTS packages, asking a customer “What do you want?” without first showing what there is, is a ‘lose-lose’ scenario. This approach will likely result in unnecessary requirements which are not aligned with the package you are implementing.

Platform
One thing to start off with is to have a structured platform in place where you can store requirements. In smaller projects this can be as simple as an Excel spreadsheet, whereas in enterprise scenarios you would benefit from using an enterprise tool like Caliber or Microsoft Team Foundation Server. In any case, it is critical that the functional requirements can be viewed by multiple people at the same time and that they are under source control. This way you can go back and see when and why this requirement changed and avoid numerous discussions later on.

Seven-step process
Once your platform to store the functional requirements is in place, the actual requirement gathering can start. From my experiences I have created a seven-step process which will help guide you through this phase.

1. Identify one or more client stakeholders (I strongly advise having less than 3 people) who have strong expertise around the business processes. These are people who can make decisions and are willing to defend them on behalf of their line of business.

2. Introduce these people to the look and feel of your CRM product of choice using a general product demo. Show them how to navigate, how to perform Create, Read, Update and Delete (CRUD) operations, etc. .

3. Use a questionnaire to have a high-level conversation around requirements. In most enterprise projects, you will already have gone through a number of discovery workshops in the pre-sales phase where a lot of valuable information should be captured already. 

4. Discuss these requirements with your CRM tool subject matter experts (SMEs) and let them come up with feedback and a high-level solution design for each of these requirements. For example, if a customer is looking for functionality X, but the COTS tool works in a different (Y) way,  your SME should advise that functionality Y provides similar functionality and will keep the risk and costs lower.

5. Based on the SME’s recommendations and high-level solution design, have your development team create a number of proofs of concepts (PoCs). Make sure that at this point the developer standards and best-practices within the development team are already finalized, Otherwise you’ll end up refactoring a lot when the actual development phase starts. From my experiences, 80% of your proof of concept should be re-useable when starting the actual development phase.

 6. Demo these PoCs to the customer and then have the conversations around the detailed business processes. When the business stakeholders can actually see what the tool can do, it will be a lot easier for them to come up with requirements that align with the “out of the box” solution.

7. Input all of these requirements into your platform of choice.  The next step is then to start prioritizing the requirements on importance and business value. The final goal should be to have a clear phased approach in place with big chunks of functionality to define the scope of the several phases.

The final action is then to get a sign-off from your customer on this scope and then all of this information can be given back to the SMEs and development team so they can create a technical design document for your first phase scope. It is wise to hold off on the detailed phase 2 scope until you get to a state where the phase 1 development is almost finished, as this is something which can change based on questions and feedback on the development of phase 1.

Tips
 When you get closer to the deadline of your phase 1 go-live, pressure will rise and certain gaps will be identified which might result in last-minute change requests for your phase 1. My advice here is that this can become a never-ending cycle and the only way to get out of this is to freeze your phase 1 scope and place further change requests in a future phase.

A final point to stress is that it is also very important to keep updating your functional and technical design documents during the implementation. Otherwise you’ll end up in a situation where your documentation is out of sync with what is actually developed and the testers will start raising false defects, and confusion will arise on what was agreed.

Conclusion
 Gathering requirements is a very important milestone in every CRM implementation which should not be underestimated. The key objectives should be to set realistic expectations, define a clear scope, and keep aiming for win-win scenarios where you use as much out-of-the-box functionality as possible. As an enterprise service provider, Hewlett-Packard has a global pool of expert resources that can help guide you through this process. If you would like to find out more about this, please get in touch by sending an email to hpmicrosoftdynamicscrm@hp.com.

Thanks for reading!

Dependent Picklist in MScrm 2011

Dependent Picklist in CRM 2011

             MS CRM 2011 doesn't have Out-Of-the-Box functionality to filter the option set values based on the value selected in another option set. We can implement this functionality using Javascript. Lets consider one example here. We have two option set fields called Country and City. City field has to be filtered based on the value selected in Country field. Below JScript code will do this functionality.

Prerequisite:

1. Create two optionset fields named new_country(with values say, India, USA and Srilanka) and new_city(with values say, Bangalore, Delhi, New York, Colombo, California and Hyderabad).
2. Create a JScript Webresource with the below code.
3. Attach this webrecource to call optionSetChanged() method on change of Country field and OnLoad of the form.
4. Configure getCollection() method to match the Cities with respect to Country.


/************************
Functionality: To populate the picklist values based on the value selected in another picklist.
Field Name: new_country
Field Event: OnChange, OnLoad
***************************/

function optionSetChanged() {

    ///<summary>
    /// Change the dependent picklist values based on the value selected in the control picklist.
    ///</summary>

    var _collection = getCollection();
    var _selectedCity = null;
    var _cityOptionset = Xrm.Page.ui.controls.get("new_city");
    if (_cityOptionset != null)
        _selectedCity = _cityOptionset.getAttribute().getValue();

    var _cityOptions = _cityOptionset.getAttribute().getOptions();
    var _selectedCountry = Xrm.Page.getAttribute("new_country").getText();
        
    // If Country is empty, then clear the City field.
    if (_selectedCountry == "") {
        _cityOptionset.clearOptions();
    }
    else {
        for (var i = 0; i < _collection.length; i++) {
            if (_selectedCountry.toLowerCase() == _collection[i].Country.toLowerCase()) {
                _cityOptionset.clearOptions();
                for (var j = 0; j < _collection[i].Cities.length; j++) {
                    for (var k = 0; k < _cityOptions.length; k++) {
                        if (_collection[i].Cities[j].toLowerCase() == _cityOptions[k].text.toLowerCase()) {
                            _cityOptionset.addOption(_cityOptions[k]);
                            break;
                        }
                    }
                }
                break;
            }
        }
        if (_cityOptionset != null && _selectedCity != null)
            _cityOptionset.getAttribute().setValue(_selectedCity);
    }
}


function getCollection() {

    ///<summary>
    /// Creates and returns a collection of Cities with respect to their Countries.
    ///</summary>

    var _collection = new Array();
    var India_Cities = new Array("Bangalore", "Delhi", "Hyderabad");
    var India_obj = { Country: "India", Cities: India_Cities };
    _collection.push(India_obj);

    var Srilanka_Cities = new Array("Colombo");
    var SriLanka_obj = { Country: "SriLanka", Cities: Srilanka_Cities };
    _collection.push(SriLanka_obj);

    var USA_Cities = new Array("California", "New York");
    var USA_obj = { Country: "USA", Cities: USA_Cities };
    _collection.push(USA_obj);

    return _collection;
}



    This functionality can be tested by changing the Country field and check the values populated in City field. Result of this dependent pick list is can be seen here.

Country: India and Cities: Bangalore,Delhi & Hyderabad.

Country: USA and Cities: California & NewYork.

Monday, 10 June 2013

mscrm_facebook integration : Display Contact picture from Facebook in mscrm


http://blogs.msdn.com/b/crm/archive/2011/09/28/displaying-a-contact-s-facebook-picture-in-microsoft-dynamics-crm-2011.aspx

This Entire Integration is based on 0nly one URL and that is,
As you may Know, Each and Every User in Facebook has an Unique ID, Some change them into Alphabets called
“your Facebook URL” you can do this in Facebook Setting, and some leave as Numbers.
This User’s Facebook URL can be Generally fall in Users First and Last name, as follows
So, Most of the Organizations Collect First and Last name while creating a contact.
If you use
http://graph.facebook.com/userid/picture?type=large  //Large size picture
http://graph.facebook.com/userid/picture?type=small // Small size picture
http://graph.facebook.com/userid/picture?type=normal // Normal size Picture
the above url Displays users Profile Picture separately without any other user Information.
Now. we come to CRM,
Create a new CRM webresource javascript type and paste the following code.
function pp()
{
var profilepicture = Xrm.Page.getControl(“WebResource_profile”);
// ”WebResource_profile” Name of the other web resource which you place in the form to display the Picture. 
if (!profilepicture)
{
return;
}
//Get the first and lat name of the Contact
var fn = Xrm.Page.data.entity.attributes.get(“firstname”).getValue();
var ln = Xrm.Page.data.entity.attributes.get(“lastname”).getValue();
var fin = fn+ln; // Concatenate the First and last name without space.
var furl = ”http://graph.facebook.com/&#8221; + fn + “/picture?type=large”;
//Then set the finalized URL as the Source for the web-resource placed in the Form.
profilepicture.setSrc(furl);
}
The Above Code downloads the Large picture from contact’s Facebook account.
Now, Customize the Entity Form by adding a new webresource, with some common profile picture as default.
add the JavaScript webresource with any message you want, onload, OnSave or Onchange of the Form method.
you can also further redesign the code by inserting a new field for facebookID and pass the data directly in to URL, in this case the CRM user must know the contacts FacebookID to Display the Picture.
I do know that the resultant picture is not 100% accurate and not reliable.
But I hope this code can be further developed which might enable the CRM users to search the Contacts in facebook and Save the Desired Picture from the result.

Friday, 7 June 2013

Twitter interface integration with mscrm 2011

In the sample below I will show you how to integrate Microsoft Dynamics CRM and Twitter on Account form. Below are the detailed steps:

* Save the below html code to an html file (Copy and paste into Notepad and then do a Save As)

<HTML><HEAD>
<META charset=utf-8></HEAD>
<BODY contentEditable=true>
<SCRIPT src="http://widgets.twimg.com/j/2/widget.js"></SCRIPT>

<SCRIPT>
var search = parent.document.forms[0].all.name.DataValue;
new TWTR.Widget({version: 2,type: 'profile',rpp: 10,interval: 2000,width: 630,height: 300,theme: { shell: { background: 'transparent', color: '#333' },tweets: { background: 'transparent', color: '#333', links: '#c10000' }
},
features: { scrollbar: false, loop: true, live: false, hashtags: true, timestamp: true, avatars: true, toptweets: true, behavior: 'default' }
}).render().setUser(search).start();
    </SCRIPT>

</BODY></HTML>

*Go to CRM, Settings, Customizations, Customize The System, Web Resources and Click the New button.
* Give the Web Resource a name and specify the type as a Web Page. Browse to the location where you saved your html file, select it and then press the save button.
* Customize the Account entity by going to Settings, Customizations, Customize the Solution, Entities, Leads, Form and add the Web Resource to the Main Form. Open up the Main Form, click the Insert tab and select the Web Resource that you just created.
* Save and Publish

You will now see a windows on the Account  form for the Twitter  interface. When you Can find top 10 Twits for this account 

Linkedin interface integration with mscrm 2011

In the sample below I will show you how to integrate Microsoft Dynamics CRM and LinkedIn. I found a post from Leon Tribe (an MVP for Microsoft Dynamics CRM) that explains it clearly for Microsoft Dynamics CRM 2011. Below are the detailed steps:

* Save the below html code to an html file (Copy and paste into Notepad and then do a Save As)

<html>
<head>
<script src="http://www.linkedin.com/companyInsider?script&useBorder=no" type="text/javascript"> </script>
</head>
<body>
<center>
<span id="getlinkedin"> </span>
</center>
<script type="text/javascript">
var parentForm = parent.frames.document.crmForm;
new LinkedIn.CompanyInsiderBox("getlinkedin",parentForm.all.companyname.DataValue);
</script>
</body>


*Go to CRM, Settings, Customizations, Customize The System, Web Resources and Click the New button.
* Give the Web Resource a name and specify the type as a Web Page. Browse to the location where you saved your html file, select it and then press the save button.
* Customize the lead entity by going to Settings, Customizations, Customize the Solution, Entities, Leads, Form and add the Web Resource to the Main Form. Open up the Main Form, click the Insert tab and select the Web Resource that you just created.
* Save and Publish

You will now see a windows on the Lead form for the LinkedIn interface. When you change the Lead record’s Company, the LinkedIn window is adjusted to show you who you know that works there and a link to show everyone else that works there that you may have access to.