簡體   English   中英

當潛在客戶合格時,如何防止Dynamics CRM 2015創造機會?

[英]How to prevent Dynamics CRM 2015 from creating an opportunity when a lead is qualified?

單擊潛在客戶實體表單中的Qualify按鈕時的要求:

  • 不要創造機會
  • 保留原始的CRM合格線索JavaScript
  • 檢測重復並顯示潛在客戶的重復檢測表格
  • 完成后,重定向到聯系人(合並或創建的版本)

最簡單的方法是為消息“ QualifyLead”創建一個在Pre-Validation上運行的插件。 在此插件中,您只需要將CreateOpportunity輸入屬性設置為false。 因此,它看起來像:

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    context.InputParameters["CreateOpportunity"] = false;
}

或者,您也可以采用更花哨的方式:

public void Execute(IServiceProvider serviceProvider)
{
    IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
    var qualifyRequest = new QualifyLeadRequest();
    qualifyRequest.Parameters  = context.InputParameters;
    qualifyRequest.CreateOpportunity = false;
}

請記住,它應該是預先驗證才能正常工作。 這樣,您就可以保留現有的“合格”按鈕,而無需進行任何JavaScript修改。

因此,Pawel Gradecki已經發布了如何在潛在客戶合格后阻止CRM創造機會。 棘手的部分是使UI /客戶端刷新或重定向到聯系人,因為如果沒有創建機會,則CRM不會執行任何操作。

在開始之前,Pawel指出

不支持某些代碼,因此升級時請小心

除了CRM 2015之外,我沒有其他版本的經驗,但是他寫道,在CRM 2016中有更好的方法可以做到這一點,因此請升級。 此修復程序現在很容易實現,升級后很容易刪除。

添加一個JavaScript資源,並在Lead表單的OnSave事件中注冊它。 下面的代碼在TypeScript中。 TypeScript輸出(js版本)在此答案的結尾。

function OnSave(executionContext: ExecutionContext | undefined) {
    let eventArgs = executionContext && executionContext.getEventArgs()
    if (!eventArgs || eventArgs.isDefaultPrevented() || eventArgs.getSaveMode() !== Xrm.SaveMode.qualify)
        return

    // Override the callback that's executed when the duplicate detection form is closed after selecting which contact to merge with.
    // This callback is not executed if the form is cancelled.
    let originalCallback = Mscrm.LeadCommandActions.performActionAfterHandleLeadDuplication
    Mscrm.LeadCommandActions.performActionAfterHandleLeadDuplication = (returnValue) => {
        originalCallback(returnValue)
        RedirectToContact()
    }

    // Because Opportunities isn't created, and CRM only redirects if an opportunity is created upon lead qualification,
    // we have to write custom code to redirect to the contact instead
    RedirectToContact()
}

// CRM doesn't tell us when the contact is created, since its qualifyLead callback does nothing unless it finds an opportunity to redirect to.
// This function tries to redirect whenever the contact is created
function RedirectToContact(retryCount = 0) {
    if (retryCount === 10)
        return Xrm.Utility.alertDialog("Could not redirect you to the contact. Perhaps something went wrong while CRM tried to create it. Please try again or contact the nerds in the IT department.")

    setTimeout(() => {
        if ($("iframe[src*=dup_warning]", parent.document).length)
            return // Return if the duplicate detection form is visible. This function is called again when it's closed

        let leadId = Xrm.Page.data.entity.getId()
        $.getJSON(Xrm.Page.context.getClientUrl() + `/XRMServices/2011/OrganizationData.svc/LeadSet(guid'${leadId}')?$select=ParentContactId`)
            .then(r => {
                if (!r.d.ParentContactId.Id)
                    return RedirectToContact(retryCount + 1)

                Xrm.Utility.openEntityForm("contact", r.d.ParentContactId.Id)
            })
            .fail((_, __, err) => Xrm.Utility.alertDialog(`Something went wrong. Please try again or contact the IT-department.\n\nGuru meditation:\n${err}`))
    }, 1000)
}

TypeScript定義:

declare var Mscrm: Mscrm

interface Mscrm {
    LeadCommandActions: LeadCommandActions
}

interface LeadCommandActions {
    performActionAfterHandleLeadDuplication: { (returnValue: any): void }
}

declare var Xrm: Xrm

interface Xrm {
    Page: Page
    SaveMode: typeof SaveModeEnum
    Utility: Utility
}

interface Utility {
    alertDialog(message: string): void
    openEntityForm(name: string, id?: string): Object
}

interface ExecutionContext {
    getEventArgs(): SaveEventArgs
}

interface SaveEventArgs {
    getSaveMode(): SaveModeEnum
    isDefaultPrevented(): boolean
}

interface Page {
    context: Context
    data: Data
}

interface Context {
    getClientUrl(): string
}

interface Data {
    entity: Entity
}

interface Entity {
    getId(): string
}

declare enum SaveModeEnum {
    qualify
}

TypeScript輸出:

function OnSave(executionContext) {
    var eventArgs = executionContext && executionContext.getEventArgs();
    if (!eventArgs || eventArgs.isDefaultPrevented() || eventArgs.getSaveMode() !== Xrm.SaveMode.qualify)
        return;
    var originalCallback = Mscrm.LeadCommandActions.performActionAfterHandleLeadDuplication;
    Mscrm.LeadCommandActions.performActionAfterHandleLeadDuplication = function (returnValue) {
        originalCallback(returnValue);
        RedirectToContact();
    };
    RedirectToContact();
}
function RedirectToContact(retryCount) {
    if (retryCount === void 0) { retryCount = 0; }
    if (retryCount === 10)
        return Xrm.Utility.alertDialog("Could not redirect you to the contact. Perhaps something went wrong while CRM tried to create it. Please try again or contact the nerds in the IT department.");
    setTimeout(function () {
        if ($("iframe[src*=dup_warning]", parent.document).length)
            return;
        var leadId = Xrm.Page.data.entity.getId();
        $.getJSON(Xrm.Page.context.getClientUrl() + ("/XRMServices/2011/OrganizationData.svc/LeadSet(guid'" + leadId + "')?$select=ParentContactId"))
            .then(function (r) {
            if (!r.d.ParentContactId.Id)
                return RedirectToContact(retryCount + 1);
            Xrm.Utility.openEntityForm("contact", r.d.ParentContactId.Id);
        })
            .fail(function (_, __, err) { return Xrm.Utility.alertDialog("Something went wrong. Please try again or contact the IT-department.\n\nGuru meditation:\n" + err); });
    }, 1000);
}

在我們的Thrives博客上發布了一個功能齊全且受支持的解決方案: https ://www.thrives.be/dynamics-crm/functional/lead-qualification-well-skip-that-opportunity。

基本上,我們隨后將Pawel提到的插件修改與客戶端重定向(僅使用受支持的JavaScript)結合在一起:

function RefreshOnQualify(eventContext) {
    if (eventContext != null && eventContext.getEventArgs() != null) {
        if (eventContext.getEventArgs().getSaveMode() == 16) {
            setTimeout(function () {
                Xrm.Page.data.refresh(false).then(function () {
                    var contactId = Xrm.Page.getAttribute("parentcontactid").getValue();
                    if (contactId != null && contactId.length > 0) {
                        Xrm.Utility.openEntityForm(contactId[0].entityType, contactId[0].id)
                    }
                }, function (error) { console.log(error) });;
            }, 1500);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM