Кастомизация
13
Мар
2

Квалификация Интереса в один клик

Каждый раз, когда пользователь квалифицирует Интерес, ему предоставляется возможность создать Организацию/Контакт/Возможную сделку и открыть созданные записи. И если пользователю каждый разу нужно выделять все эти опции, то ему может быстро надоесть выполнять по 8 кликов! Чтобы как-то спасти юзверов, можно создать новую кнопку квалификации Интереса, которая будет выполнять все эти действия в один клик.

Все просто:

  • Создайте JS Веб-ресурс с таким кодом (поменяйте в нем только GUID валюты, которую нужно подставить в создаваемые записи):
    
    
    // Отправляет SOAP запрос квалификации Интереса
    function qualifyRequest() {
    
        var leadId = Xrm.Page.data.entity.getId();
        var currencyId = "684C0FEA-9881-E011-8FD5-000C29CDB72E";
        var status = -1;
    
        var request = "<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>" +
            "<s:Body>" +
            "  <Execute xmlns='http://schemas.microsoft.com/xrm/2011/Contracts/Services' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'>" +
            "    <request i:type='b:QualifyLeadRequest' xmlns:a='http://schemas.microsoft.com/xrm/2011/Contracts' xmlns:b='http://schemas.microsoft.com/crm/2011/Contracts'>" +
            "      <a:Parameters xmlns:c='http://schemas.datacontract.org/2004/07/System.Collections.Generic'>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>LeadId</c:key>" +
            "          <c:value i:type='a:EntityReference'>" +
            "            <a:Id>" + leadId + "</a:Id>" +
            "            <a:LogicalName>lead</a:LogicalName>" +
            "            <a:Name i:nil='true' />" +
            "          </c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>CreateAccount</c:key>" +
            "          <c:value i:type='d:boolean' xmlns:d='http://www.w3.org/2001/XMLSchema'>true</c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>CreateContact</c:key>" +
            "          <c:value i:type='d:boolean' xmlns:d='http://www.w3.org/2001/XMLSchema'>true</c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>CreateOpportunity</c:key>" +
            "          <c:value i:type='d:boolean' xmlns:d='http://www.w3.org/2001/XMLSchema'>true</c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>OpportunityCurrencyId</c:key>" +
            "          <c:value i:type='a:EntityReference'>" +
            "            <a:Id>" + currencyId + "</a:Id>" +
            "            <a:LogicalName>transactioncurrency</a:LogicalName>" +
            "            <a:Name i:nil='true' />" +
            "          </c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>SourceCampaignId</c:key>" +
            "          <c:value i:nil='true' />" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>OpportunityCustomerId</c:key>" +
            "          <c:value i:nil='true' />" +
            "        </a:KeyValuePairOfstringanyType>" +
            "        <a:KeyValuePairOfstringanyType>" +
            "          <c:key>Status</c:key>" +
            "          <c:value i:type='a:OptionSetValue'>" +
            "            <a:Value>" + status + "</a:Value>" +
            "          </c:value>" +
            "        </a:KeyValuePairOfstringanyType>" +
            "      </a:Parameters>" +
            "      <a:RequestId i:nil='true' />" +
            "      <a:RequestName>QualifyLead</a:RequestName>" +
            "    </request>" +
            "  </Execute>" +
            "</s:Body>" +
            "</s:Envelope>";
    
        var OrgServicePath = "/XRMServices/2011/Organization.svc/web";
        var serverUrl = Xrm.Page.context.getServerUrl();
    
        var req = new XMLHttpRequest();
        req.open("POST", serverUrl + OrgServicePath, true)
        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");
        req.onreadystatechange = function () { qualifyResponse(req); };
        req.send(request);
    }
    
    function qualifyResponse(req) {
        // В зависимости от статус полученного ответа вызываем соответствующую функцию
        if (req.readyState == 4) {
            if (req.status == 200)
                _getSuccess(req.responseXML);
            else
                _getError(req.responseXML);
        }
    }
    
    function _getSuccess(responseXml) {
        var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(responseXml.xml);
        x = xmlDoc.getElementsByTagName("a:KeyValuePairOfstringanyType");
        for (i = 0; i < x.length; i++) {
            var y = xmlDoc.getElementsByTagName("a:EntityReference");
            for (j = 0; j < y.length; j++) {
                if (y[j].getElementsByTagName("a:LogicalName")[0].text == "opportunity") {
                    var oppId = y[j].getElementsByTagName("a:Id")[0].text;
                    var serverUrl = Xrm.Page.context.getServerUrl();
                    // Открываем Возможную сделку
                    window.open(serverUrl + "/main.aspx?etc=3&extraqs=%3f_gridType%3d3%26etc%3d3%26id%3d%257b" + oppId + "%257d%26rskey%3d598263346&pagetype=entityrecord", "new_opp");
                    window.location.reload(true);
                }
            }
        }
    }
    
    // Обрабатываем ошибки
    function _getError(faultXml) {
        var errorMessage = "Unknown Error (Unable to parse the fault)";
        if (typeof faultXml == "object") {
            try {
                var bodyNode = faultXml.firstChild.firstChild;
                for (var i = 0; i < bodyNode.childNodes.length; i++) {
                    var node = bodyNode.childNodes[i];
                    if ("s:Fault" == node.nodeName) {
                        for (var j = 0; j < node.childNodes.length; j++) {
                            var faultStringNode = node.childNodes[j];
                            if ("faultstring" == faultStringNode.nodeName) {
                                errorMessage = faultStringNode.text;
                                break;
                            }
                        }
                        break;
                    }
                }
            } catch (e) { };
        }
        return new Error(errorMessage);
    }
    
  • Создайте на Ленте Интереса кнопку вызывающую этот JS-код (рисунок кнопки, которую я использовал):
    <RibbonDiffXml>
      <CustomActions>
        <CustomAction Id="leadConvert.CustomAction"
                      Location="Mscrm.Form.lead.MainTab.Actions.Controls._children"
                      Sequence="1" >
          <CommandUIDefinition>
            <Button Id="leadConvert.Button"
                    LabelText="Конвертировать"
                    ToolTipTitle="Конвертировать"
                    ToolTipDescription="Конвертировать"
                    TemplateAlias="o1"
                    Sequence="51"
                    Image32by32="$webresource:new_convert_32.png"
                    Command="leadConvert.CommandDefinition" />
          </CommandUIDefinition>
        </CustomAction>
      </CustomActions>
      <Templates>
        <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
      </Templates>
      <CommandDefinitions>
        <CommandDefinition Id="leadConvert.CommandDefinition">
          <EnableRules>
            <EnableRule Id="Mscrm.Enabled" />
          </EnableRules>
          <DisplayRules/>
          <Actions>
            <JavaScriptFunction Library="$webresource:new_leadQualify.js" FunctionName="qualifyRequest" />
          </Actions>
        </CommandDefinition>
      </CommandDefinitions>
      <RuleDefinitions>
        <TabDisplayRules/>
        <DisplayRules/>
        <EnableRules/>
      </RuleDefinitions>
      <LocLabels />
    </RibbonDiffXml>
    




Комментарии (2)
  • Владимир 13.03.2012

    А если у меня в системе по какой то причине у валюты будет другой идентификатор?

  • slivka_83 13.03.2012

    ну, поменяйте его на свой 🙂

*

code