Квалификация Интереса в один клик
Каждый раз, когда пользователь квалифицирует Интерес, ему предоставляется возможность создать Организацию/Контакт/Возможную сделку и открыть созданные записи. И если пользователю каждый разу нужно выделять все эти опции, то ему может быстро надоесть выполнять по 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>
А если у меня в системе по какой то причине у валюты будет другой идентификатор?
ну, поменяйте его на свой 🙂