Sdílet prostřednictvím


Nastavení pravidel rezervace

Pravidla rezervace v aplikaci Field Service vytvářejí varovné nebo chybové zprávy, které se zobrazí uživatelům (na základě vlastních podmínek) při vytváření nebo úpravě záznamu o rezervaci zdroje. Pravidlo rezervace lze například vytvořit za účelem upozornění uživatele při pokusu o rezervaci pracovního příkazu na plánovací vývěsce pro zdroj, který nemá dovednosti požadované pro danou úlohu.

Pravidla rezervace jsou vlastní metody JavaScript, které budou provedeny před vytvořením nebo úpravou záznamu rezervace rezervovatelného zdroje. Metoda JavaScriptu může přijmout parametr, který bude obsahovat informace o vytvářeném záznamu rezervace rezervovatelného zdroje a musí vrátit objekt JavaScriptu s požadovanými vlastnostmi.

Nastavte pravidla rezervace k ověření rezervace při jejím vytváření nebo úpravě.

Poznámka:

  • Pravidla rezervace jsou k dispozici pouze pro hodinové zobrazení, nikoli pro denní, týdenní nebo měsíční zobrazení plánovací tabule a asistenta plánování. Jsou také k dispozici, když je rezervace vytvořena nebo aktualizována prostřednictvím rezervačního formuláře rezervačního zdroje.
  • Pravidla rezervace nejsou k dispozici ve formuláři rezervace rezervovatelných zdrojů, pokud má ve formuláři povoleno tok obchodního procesu.
  • Pravidla rezervace nejsou k dispozici pro funkci opětovného přiřazení na plánovací vývěsce.
  • Každé vlastní pravidlo rezervace může vrátit pouze jednu chybu/varování. Chcete-li vrátit více zpráv, nastavte pro každé ověření individuální pravidla rezervace.

Vytvoření řešení

Prvním krokem k nastavení pravidla rezervace je vytvoření vlastního webového prostředku jazyka JavaScript. Doporučujeme, abyste v CRM vytvořili řešení a přidali svůj vlastní webový prostředek jazyka JavaScript nebo pro přizpůsobení použili vlastní, již existující řešení.

Vytvoření řešení CRM

  1. Z Nastavení>Řešení vytvořte nové řešení pro webové prostředky jazyka JavaScript pravidla rezervace.

Následující screenshot zobrazuje nově vytvořené řešení. Doporučujeme, aby vaše řešení používalo jedinečného vydavatele místo výchozího vydavatele.

Snímek obrazovky pravidel rezervace pro Field Service.

  1. Po vytvoření řešení vyberte součást Webové prostředky a vytvořte nový webový prostředek.
  2. Do formuláře nového webového prostředku zadejte následující informace: a. Název b. Zobrazovaný název c. Jako typ vyberte Skript (Jscript).
  3. Vyberte možnost textového editoru a zadejte kód jazyka JavaScript pro pravidlo rezervace.
  4. Volbou Uložit uložte webový prostředek.
  5. Vyberte Publikovat, abyste zajistili publikování webového prostředku pravidla rezervace.

Snímek obrazovky nového webového prostředku.

Nastavení pravidla rezervace

  1. V hlavní nabídce přejděte na Field Service>Prostředky a poté vyberte Pravidla rezervace v sekci Nastavení rezervace.

    Snímek obrazovky aktivních pravidel rezervace pro Field Service.

  2. Volbou +Nové vytvořte nové pravidlo rezervace.

  3. Ve formuláři pravidla rezervace zadejte následující informace: a. Název b. Webový prostředek (vyberte webový prostředek, který jste předtím vytvořili). c. Zadejte název metody, který jste definovali v kódu JavaScript.

    Snímek obrazovky pravidel rezervace.

  4. Uložte pravidlo rezervace. Jakmile pravidlo rezervace uložíte, použije jej hodinové zobrazení plánovací vývěsky a plánovače nebo formulář entity. Můžete deaktivovat svůj záznam o pravidlech rezervace, abyste zabránili spuštění plánovací vývěsky, asistenta plánování nebo formuláře rezervační entity.

Poznámka:

Pravidla rezervace jsou aktuálně podporována pouze v hodinovém zobrazení plánovací vývěsky a asistenta plánování. Pravidla rezervace jsou podporována také při vytváření nebo aktualizaci rezervací pomocí rezervačního formuláře rezervačního zdroje. Pravidla rezervace se neprovádí při odstranění záznamu rezervace. Pravidla rezervace nefungují ve formulářích při použití vícenásobných úprav.

Vytvoření akce CRM

V této části se podíváme na příklad, který ukazuje, jak můžete pomocí vlastní akce CRM provést ověření jako součást pravidla rezervace.

Při použití akce CRM pro ověření pravidla rezervace budete ještě muset vytvořit vlastní webový prostředek, jak je definováno výše. JavaScript, který definujete ve svém vlastním webovém prostředku, zavolá vlastní akci CRM a vyhodnotí výsledky z vlastní akce CRM. Ukázkový kód, který můžete použít k volání vlastní akce CRM, naleznete v příloze A na konci tohoto dokumentu.

V CRM bude nutné vytvořit vlastní akci CRM. Pro přidání vlastní akce CRM doporučujeme použít řešení CRM, které jste definovali pro vlastní webový prostředek.

Vlastní akce CRM by měla mít následující vstupní a výstupní parametry. Podle svého scénáře můžete přidat další vstupní a výstupní parametry. Budete muset zajistit, aby byl JavaScript, který definujete pro volání vlastní akce CRM, aktualizován tak, aby podporoval vaše další vstupní a výstupní parametry.

Vstupní parametry:

  • originalScheduleStart – DateTime
  • originalScheduleEnd – DateTime
  • originalBookableResource – EntityReference
  • originalScheduleSource – Picklist
  • newScheduleStart – DateTime
  • newScheduleEnd – DateTime
  • isCreate – Boolean
  • isUpdate – Boolean

Výstupní parametry:

  • isError – Boolean
  • isWarning – Boolean
  • errorMessage – String
  • warningMessage - String

Následující screenshot ukazuje příklad vlastní akce CRM. Tento příklad kontroluje, zda se parametr newBookableResource shoduje s preferovaným prostředkem v pracovním příkazu a zda je parametr newScheduleStart v rozmezí hodnot Slíbený počáteční čas a Slíbený koncový čas. Předpokládá se, že data slíbeného okna jsou pro jedno datum. Příklad: Slíbený počáteční čas: 01.01.2016 8:00 / Slíbený koncový čas: 01.01.2016 12:00.

Snímek obrazovky vlastní akce CRM.

Ukázkový kód

Funkce JavaScript, kterou jste vytvořili, může přijmout jediný parametr, který je považován za kontext rezervace. Předaný parametr kontextu rezervace není typický kontext CRM používaný při skriptování na straně klienta.

Schéma kontextu rezervace:

export type BookingRuleContext = {
    oldValues: BookingRuleBookingRecord;
    newValues: BookingRuleBookingRecord;
    isCreate: boolean;
    isUpdate: boolean;
};
 
export type BookingRuleBookingRecord = {
    ResourceRequirementId?: string;
    ResourceId?: string;
    StartTime?: Date;
    EndTime?: Date;
    ResourceScheduleSource?: string;
};

Parametr Kontext rezervace bude mít následující definici jazyka JavaScript.

Poznámka:

Tento kód JavaScript není nutné zahrnout do vlastního webového prostředku pro pravidlo rezervace.

Možné hodnoty pro ResourceScheduleSource jsou z globální sady možností pro původ plánu zdroje. Tuto vlastnost můžete využít k tomu, abyste věděli, zda je pravidlo rezervace aktivováno z plánovací vývěsky nebo z pomocníka plánování.

    var sbContext = {
    oldValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    newValues: {
        StartTime: "01/01/2016 08:00AM",
        EndTime: "01/01/2016 05:00PM",
        ResourceId: "00000000-0000-0000-0000-00000000",
        ResourceScheduleSource: 690970001
    },
    isCreate: true,
    isUpdate: false
    };

Vaše metoda ověření musí vrátit objekt JavaScript s následující definicí.

Poznámka:

Tento kód JavaScript není nutné zahrnout do vlastního webového prostředku pro pravidlo rezervace.

    var ruleResult = {
    IsValid: false,
    Message: "Some Message Here",
    Type: "error" // this can be either "error" or "warning"
};

Příklad definice funkce JavaScriptu. Následující kód JavaScript je jediný kód JavaScript, který musíte zahrnout do vlastního webového prostředku.


    function Validate(ctx) {
      var url = Xrm.Page.context.getClientUrl();
      var ruleResult = {
  	IsValid: false,
       Message: '',
       Type: 'error'
      };

      //
      // perform some lookups or other validation logic here.
      //
  
      ruleResult.IsValid = false;
      ruleResult.Message = 'Some Error Message Here.';
      ruleResult.Type = 'error';

      return ruleResult;
    }

Následující kód JavaScript lze použít k volání vlastní akce CRM, která má stejné vstupní a výstupní parametry jako předchozí ukázka.

V záznamu pravidla rezervace musí být Název metody: MSFSAENG.ScheduleBoard.Validate. Informace najdete na screenshotu v tomto článku v části „Nastavení pravidla rezervace“.


    /// <reference path="xrm.d.ts" />
    function brErrorCallback(sb) {
    // Add custom error handeling here if desired.
     return;
    }
    function brWarningCallback(sb) {
    // Add custom warning handeling here if desired.
    return;
    }
    function brSuccessCallback(sb) {
    // add custom sucess handeling here if desired.
    return;
    }
    var MSFSAENG;
    (function (MSFSAENG) {
    MSFSAENG.ScheduleBoard = {
        url: Xrm.Page.context.getClientUrl() + "/api/data/v8.1/",
        actionName: "msfsaeng_MSFSAScheduleBoardRuleActionSample",
        actionInputParameters: function (ctx) {
            var inputParameters = {};
            if (ctx.isUpdate) {
                inputParameters = {
                    "originalScheduleStart": ctx.oldValues.StartTime,
                    "originalScheduleEnd": ctx.oldValues.EndTime,
                    "originalBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.oldValues.ResourceId,
                        "name": ""
                    },
                    "originalScheduleSource": ctx.oldValues.ResourceScheduleSource,
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            else {
                inputParameters = {
                    "newScheduleStart": ctx.newValues.StartTime,
                    "newScheduleEnd": ctx.newValues.EndTime,
                    "newBookableResource": {
                        "@odata.type": "Microsoft.Dynamics.CRM.bookableresource",
                        "bookableresourceid": ctx.newValues.ResourceId,
                        "name": ""
                    },
                    "newScheduleSource": ctx.newValues.ResourceScheduleSource,
                    "isCreate": ctx.isCreate,
                    "isUpdate": ctx.isUpdate
                };
            }
            return JSON.stringify(inputParameters);
        },
        ctx: null,
        ruleResult: {
            IsValid: true,
            Message: "",
            Type: ""
        },
        outputParameters: {
            isError: false,
            isWarning: false,
            errorMessage: "",
            warningMessage: ""
        },
        Validate: function (context) {
            this.ctx = context;
            ScheduleBoardHelper.callActionWebApi(this);
            return this.ruleResult;
        },
        errorCallback: brErrorCallback,
        warningCallback: brWarningCallback,
        successCallback: brSuccessCallback
    };
    var ScheduleBoardHelper = (function () {
        function ScheduleBoardHelper() {
        }
        ScheduleBoardHelper.callActionWebApi = function (sb) {
            var oDataEndpoint = sb.url + sb.actionName;
            var req = new XMLHttpRequest();
            req.open("POST", oDataEndpoint, false);
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.onreadystatechange = function () {
                if (req.readyState == 4) {
                    req.onreadystatechange = null;
                    if (req.status == 200) {
                        sb.outputParameters = JSON.parse(req.response);
                        if (sb.outputParameters.isError) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.errorMessage;
                            sb.ruleResult.Type = 'error';
                            if (sb.errorCallback)
                                sb.errorCallback(sb);
                            return;
                        }
                        else if (sb.outputParameters.isWarning) {
                            sb.ruleResult.IsValid = false;
                            sb.ruleResult.Message = sb.outputParameters.warningMessage;
                            sb.ruleResult.Type = 'warning';
                            if (sb.warningCallback)
                                sb.warningCallback(sb);
                            return;
                        }
                        else {
                            sb.ruleResult.IsValid = true;
                            sb.ruleResult.Message = '';
                            sb.ruleResult.Type = '';
                            if (sb.successCallback)
                                sb.successCallback(sb);
                            return;
                        }
                    }
                    else {
                        alert('Error calling Rule Action. Response = ' + req.response + ', Status = ' + req.statusText);
                    }
                }
            };
            req.send(sb.actionInputParameters(sb.ctx));
        };
        return ScheduleBoardHelper;
    }());
    })(MSFSAENG || (MSFSAENG = {}));

Další poznámky

Rezervace rezervovatelného zdroje je povolena, aby bylo možné využít pravidla rezervace k vytvoření varovných nebo chybových zpráv, které se zobrazí uživatelům na základě vlastních podmínek při vytváření nebo úpravě záznamu o rezervaci zdroje. Systém používá preventDefault v pravidlech rezervace. Proto nelze toky obchodních procesů a další vlastní skripty spojené s onSaveudálostí použít na rezervace rezervovatelných zdrojů se zapnutými pravidly rezervace.

Zpracování pravidel rezervace je však možné deaktivovat uložením rezervačního formuláře povolením níže uvedeného nastavení, které uživatelům umožní využívat toky obchodních procesů. K povolení tohoto nastavení na úrovni prostředí lze použít rozhraní API na straně klienta.

Přečtěte si aktuální hodnotu nastavení msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().getCurrentAppSettings()["msdyn_DisableProcessBookingRulesOnSaveBookingForm"]

Povolte nastavení msdyn_DisableProcessBookingRulesOnSaveBookingForm.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",true,).then(() => {a = "success"}, (error) => {a = error})

Zakažte nastavení **msdyn_DisableProcessBookingRulesOnSaveBookingForm**.

Xrm.Utility.getGlobalContext().saveSettingValue("msdyn_DisableProcessBookingRulesOnSaveBookingForm",false,).then(() => {a = "success"}, (error) => {a = error})