Dynamics Customer Service – B2B scenario

This post is a part of a series of posts for Customer Service. The complete GUIDE can be found here

Many years ago Opportunity retired the Customer field and replaced it with Primary Contact and Primary Account fields. Case has not yet done this for reasons I can’t really understand. As you will see in this article we achieve the same result when adding the contact field, but the customer field is still a polymorphic lookup.

Email to Case could easily add to the contact field instead of the customer field. Field service is actually dependent on account being in the customer field for it to work properly.

This is how Case has to be setup to make sense in the B2B world:

If the Contact and Customer are known to the system, they will automatically populate. If the Contact is new to the system, the connection to the Account will be missing. In this case we need to alert the Agent, and ask them to update the contact record.

JavaScript

The following JavaScript is added to the Case form. It checks the Customer field to see if it is contact. If this is the case, it will check if the Contact has a Account connected. Most likely it will not have an Account, so we will be prompted “Do you wish to update the Contact?”. Answer YES here, and a quick view of the Contact will appear. Update Account, and then the JavaScript will do the rest for you. ✨MAGIC✨

var formContext = "";

function OnCrmPageLoad(executionContext) {
    formContext = executionContext.getFormContext();
    
    //
    //You don't need to change this. Just understand that forms have one the following states when opening
    //
    var FormTypes =
    {
        Undefined: 0,
        Create: 1,
        Update: 2,
        ReadOnly: 3,
        Disabled: 4,
        QuickCreate: 5,
        BulkEdit: 6
    }
    runAlways(formContext);
    switch (formContext.ui.getFormType()) {
        case FormTypes.Create: OnNewFormLoad(); break;
        case FormTypes.Update: OnUpdateFormLoad(); break;
        case FormTypes.ReadOnly: OnReadOnlyFormLoad(); break;
        case FormTypes.Disabled: OnDisabledFormLoad(); break;
        case FormTypes.QuickCreate: OnQuickCreateFormLoad(); break;
        case FormTypes.BulkEdit: OnBulkEditFormLoad(); break;
        case FormTypes.Undefined: alert("Error"); break;
    }
}

//
//I only use the RunAlways, OnNewFormLoad and OnUpdateFormLoad, but i keep the others here if i ever would need. 
//When looking at this you can always know what funtion is running. Easy to read and debug. 
//
function runAlways() { }
function OnNewFormLoad() {}
function OnUpdateFormLoad() {
    //
    //Clean up Contact Data. If contact has account, but account not in Customer field perform update. If Contact doen's have account ask for update
    //
    GetAccountInfo();
}
function OnReadOnlyFormLoad() { }
function OnDisabledFormLoad() { }
function OnQuickCreateFormLoad() { }
function OnBulkEditFormLoad() { }


//******************************************************************** */
//CUSTOM FUNCTIONS are added below here. Below this point you add all types of functions you need. 
//******************************************************************** */
function GetAccountInfo() {
    var CustomerField = formContext.getAttribute("customerid").getValue();
    if (CustomerField != null) {
        if (CustomerField[0].entityType == "contact") {
            var CustomerGUID = CustomerField[0].id;
            CustomerGUID = CustomerGUID.replace("{", "");
            CustomerGUID = CustomerGUID.replace("}", "");

            //
            //If the Customer Field contains a contact, I want to change this. I want the Customer Field to be an account. Step 1 is to find out if the contact has account registered.
            //
            Xrm.WebApi.online.retrieveRecord("contact", CustomerGUID, "?$select=_parentcustomerid_value").then(
                function success(result) {
                    var Id = "{" + result["_parentcustomerid_value"] + "}";
                    var Name = result["_parentcustomerid_value@OData.Community.Display.V1.FormattedValue"];
                    var LogicalName = result["_parentcustomerid_value@Microsoft.Dynamics.CRM.lookuplogicalname"];

                    //
                    //IF the contact has an account I move the Contact to Case Contact, and receive the Account from the Contact and enter it to Customer on Case.
                    //
                    if (LogicalName != null){
                        formContext.getAttribute("primarycontactid").setValue(CustomerField);
                        formContext.getAttribute("customerid").setValue([{ id: Id, name: Name, entityType: LogicalName }]);
                        formContext.data.entity.save();
                    }else{
                        //
                        //Promt if you want to open contact for update?
                        //https://carldesouza.com/how-to-implement-javascript-confirmation-dialogs-in-power-apps-and-dynamics-365/ - THANK YOU
                        //
                        var confirmStrings = { text:"Contact is not connected to Account. Please update!", title:"Data Update Recommended", confirmButtonLabel:"Open Contact", cancelButtonLabel: "Not Now" };
                        var confirmOptions = { height: 200, width: 450 };
                        Xrm.Navigation.openConfirmDialog(confirmStrings, confirmOptions).then(
                        function (success) {    
                            if (success.confirmed){
                                //
                                //If the user chooses to update, I open a small contact form, and make the user set the Account. 
                                //After Save&Close i recall this function, and then I update Account and Contact for case. 
                                //
                                Xrm.Navigation.navigateTo({pageType:"entityrecord", entityName:"contact", formType:2, formId:"e4206691-b1e3-4e9d-a23a-4865b9511091", entityId:CustomerGUID}, {target: 2, position: 1, width: {value: 20, unit:"%"},height: {value: 50, unit:"%"}}).then(
                                    function success() {
                                        GetAccountInfo();
                                    },
                                    function error() {
                                        alert("The system was not able to save the change. Please reload the page and try again");
                                    }
                                );
                            }else{
                                //Say or do something if the user doesn't update Contact
                            }
                        });

                    }
                },
                function (error) {
                    Xrm.Utility.alertDialog(error.message);
                }
            );
            
        }
    }

}

Result


Discover more from CRM Keeper

Subscribe to get the latest posts to your email.

2 thoughts on “Dynamics Customer Service – B2B scenario

  1. Great article Thomas, thanks! I work for a organisation using Dynamics CRM – Sales professional but as we are not really sales driven and operate as a b2b agency, I believe using the Customer service solution might be more optimal for us. Apart from what you have mentioned above are other alterations you would recommend to make the solution more B2B friendly.

    Like

    1. Personally i have 90% of solutions delivered for the B2B market. The important things you should consider is Portal (or alternative) for customer so have a self service function, and just make sure the customers are followed up with updates on their cases when there is one. There is not that much difference really..

      Optimally for any Customer Service scenario I would love to go away from Email, because the handling of emails in support systems is not great. Portal comments or similar features is a lot better approach to succeeding in simpler systems.

      Like

Leave a comment