Dela via


Redigera arbetstimmarskalendern med hjälp av API:er

Organisationer måste ofta programmässigt skapa, redigera eller ta bort arbetstider i kalendrarna för sina resurser. Kalendrar visar arbetstider, avbrott och pauser som avgör en resurs tillgänglighet när arbetet schemaläggs. Dessa resurser måste schemaläggas i särskilda tidszoner, kan ha verksamhetsstängningar eller inte och ha varierande kapacitet. Information om hur du definierar arbetstider i appen Field Service finns i Lägga till arbetstider till en bokningsbar resurs.

Förutom att använda appen Field Service kan du använda följande API:er för att ändra kalenderregler för valda posttyper:

  • API för Spara kalender (msdyn_SaveCalendar) skapar eller uppdaterar kalenderposter för en vald entitet, baserat på de indata som skickades som förfrågan.
  • API för ta bort kalender (msdyn_DeleteCalendar) tar bort alla interna kalenderregler i en kalender på en vald entitet, baserat på de indata som skickades som förfrågan.
  • Spara/ta bort kalender API V2 (msdyn_SaveCalendar/msdyn_DeleteCalendar, godkänn flagga UseV2) tillåter flera återkommande arbetstimmar samtidigt genom att ändra logiken för överlappande regler. Mer information finns i Vad händer om det finns överlappande regler?.

Denna artikel innehåller information om varje API:s indata (begäran) och utdata (svar), och deras användning, med exempel.

Förutsättningar

  • Plattformsversionen 9.2.21055 eller senare med Universal Resource Scheduling version 3.12.45.7.
  • Användning av någon av följande posttyper:
    • Bokningbar resurs (bookableresource)
    • Resurskrav (msdyn_resourcerequirement)
    • Mall för arbetstimmar (msdyn_workhourtemplate)
    • Projekt (msdyn_project)

Händelsetyper i kalendern

När du skapar en kalender anger du hur många gånger en arbetstidtyp ska ske en gång, hela dagen, varje dag, varje vecka eller varje dag eller du kan skapa en anpassad återkomst. Mer information om dessa kalenderhändelser finns i exemplen längre fram i artikeln.

Förekomst

När en arbetstitetstyp endast förekommer en gång i entitetens kalender, kallas den för en förekomst.

En resurs kan exempelvis arbeta mellan 05:00 och 10:00 den 26 maj 2021. Dessa API:er har endast stöd för den här typen av förekomster som startar och slutar inom samma dag. Du kan till exempel använda en resurs som arbetar från 26 maj 2021 klockan 20:00 till 10:00 den 27 maj 2021. Du kan inte skapa den här händelsen med bara ett samtal i msdyn_SaveCalendar API:et, du måste ringa två samtal i stället.

Heldagshändelse

När en arbetsdagstyp inträffar under en eller flera dagar och börjar vid midnatt (12:00) av startdatumet, är det en heldagsförekomst. Längsta varaktighet för en heldagsförekomst är fem år.

En resurs arbetar till exempel hela dagen från 26 maj 2021 till slutet av dagen den 30 maj 2021. Det här är en heldagsförekomst som varar i fem dagar.

Veckovis återkommande

När en arbetstidtyp sker samtidigt på valda dagar i varje vecka, kallas den för en veckovis återkommande.

En resurs fungerar till exempel mellan 05:00 och 10:00 varje måndag, tisdag och onsdag.

Dagligen återkommande

När en arbetstidtyp sker samtidigt varje dag, kallas den för en dagligen återkommande.

En resurs fungerar till exempel mellan 05:00 och 10:00 varje dag i veckan.

Anpassade återkommande

När en arbetstidtyp förekommer vid vissa tider på vissa veckodagar, men tiderna är olika på olika dagar, kan du skapa en Anpassade återkommande.

En resurs fungerar till exempel från 05:00 till 10:00 varje måndag och 12:00 till 15:00 varje onsdag.

Arbetstidtypersformulär

Dessa API:er har stöd för att skapa, uppdatera och ta bort åtgärder för följande typer av arbetstimmar:

Arbetstid

Arbetstider är tider då en entitet är tillgänglig för att utföra arbete.

Med hjälp av dessa API:er kan du göra följande:

  • Skapa, redigera eller ta bort en arbetstidförekomst.
  • Skapa, redigera eller ta bort en daglig arbetstidförekomst.
  • Skapa, redigera eller ta bort en veckovis arbetstidförekomst.
  • Skapa, redigera eller ta bort en anpassad arbetstidförekomst.
  • Skapa, redigera eller ta bort en arbetstidförekomst hela dagen.
  • Skapa eller redigera kapacitet på arbetstider.
  • Redigera en enstaka arbetsttidförekomst i en upprepning.
  • Redigera Detta och följa förekomster av en återkommande händelse.
  • Ändra en arbetstidförekomst till en upprepning.
  • Ändra tidszon för kalenderregeln.

Med hjälp av denna API kan du göra följande:

  • Ta bort en enstaka arbetsttidförekomst från en upprepning.
  • Skapa en förekomst som sträcker sig över 24 timmar men som inte startar och slutar vid midnatt (00:00).
  • Skapa, redigera eller ta bort en förekomst hela dagen.

Ej arbetstid

Det finns tillfällen då entiteten inte kan användas på grund av en ospecificerad orsak.

Med hjälp av dessa API:er kan du göra följande:

  • Skapa eller redigera en arbetstidförekomst hela dagen.
  • Skapa eller redigera en icke-arbetstidförekomst.
  • Ändra tidszon för kalenderregeln.

Med hjälp av dessa API:er kan du inte göra följande:

  • Skapa eller redigera en icke-arbetstidupprepning.

Brytning

Det här är tider under en arbetsdag då en entitet tar rast och inte är tillgänglig för arbete. Raster kan inte finnas utan arbetstider. De måste ske mellan två arbetstimmar per dag. Raster kan inte överlappa med arbetstider.

Med hjälp av dessa API:er kan du göra följande:

  • Skapa eller redigera raster under arbetstid.

Med hjälp av dessa API:er kan du inte göra följande:

  • Ta endast bort raster från en förekomst eller återkommande arbetstid.

Ledig tid

Det finns tillfällen då entiteten inte kan användas på grund av en semester. Orsak till ledigt tid kan anges.

Med hjälp av dessa API:er kan du göra följande:

  • Skapa eller redigera med en etikett.
  • Ändra tidszon för kalenderregeln.

Med hjälp av dessa API:er kan du inte göra följande:

  • Skapa eller redigera upprepning av ledig tid.

Företaget stänger

Du kan skapa entiteter för då företaget har stängt som definierar när företaget stängs. Med hjälp av msdyn_SaveCalendar API, Du kan ställa in varje enhet för att observera eller ignorera organisationens stängningstider genom att använda tillvalet nyckel ObserveClosure. När de har angetts att de har stängts är inte entiteterna tillgängliga för arbete.

Spara kalender-API

Indata

Förfrågan innehåller endast ett attribut CalendarEventInfo, som är en typ Sträng. Den innehåller flera andra attribut som alla är inbäddade i den här strängen.

Kommentar

I följande tabell representerar Typ det format som förväntas ge en lyckad förfrågan. Men hela förfrågan parsas som en enskild sträng.

CalendarEventInfo

Namn Typ Obligatoriskt Beskrivning
EntityLogicalName String Ja Den här nyckeln beskriver den entitet från vilken API anropas. Kalendern för entiteten ska skapas eller redigeras.
CalendarId GUID Ja Den här nyckeln innehåller kalender-ID:t för entiteten som beskrivs ovan. När någon av dessa entiteter skapas kommer även en kalenderpost att skapas automatiskt. Dessa API:er redigerar kalenderposten genom att lägga till regler eller redigera befintliga regler.
RulesAndRecurrences RulesAndRecurrences Ja Nyckeln är en matris och varje element innehåller flera attribut i listan i tabellen i följande avsnitt. Matrisens storlek ska vara minst en.
IsVaried Boolean Inga Den här nyckeln bör anges till true för anpassade återkommande scenarier.
IsEdit Boolean Inga Den här nyckeln bör anges till true för att redigera befintliga regler.
TimeZoneCode Integer Inga Den här nyckeln tar ett heltalsvärde som motsvarar tidszonen för kalenderreglerna. För mappningen går du till Tidszonskoder, längre fram i artikeln. Standardvärdet är användarens tidszon.
InnerCalendarDescription String Inga Nyckeln behövs endast om kalenderregeln är för ledig tid. Den ska innehålla en förklaring till den lediga tiden.
ObserveClosure Boolean Inga Den här nyckeln är specifik för återkommande uppgifter. Om den är inställd på true observerar entiteten företagets stängning.
RecurrenceEndDate Datum/tid No Den här nyckeln är specifik för återkommande uppgifter. Den innehåller slutdatum för återkommande data. Om tidsstämpeln är 08:00:00 eller tidigare, är återkommande slutdatum en dag före det angivna datumet. Om tidsstämpeln är 08:00:01 eller senare beror datumet på det som det är. Standardvärdet för förekomster är null. Standardvärdet för återkommande intervaller är 30 december 9999, 23:59:59 timmar, UTC.
RecurrenceSplit Boolean Inga Den här nyckeln är specifik för återkommande uppgifter. Den är inställd på true för att redigera "Detta och följande förekomster" av en återkommande.
ResourceId GUID Inga Den här nyckeln innehåller SystemUserId eller ResourceId och ska endast skickas när enheten som är associerad med detta samtal är en bokningsbar resurs av typen SystemUser. Detta är nödvändigt för att kontrollera om det finns privilegier för OwnCalendar på fliken Servicehantering.
UseV2 Flagga No Genom att godkänna den här flagga aktiveras V2-versionen av kalendern för arbetstid med en förbättrad överlappande regellogik som möjliggör flera återkommande. Mer information finns i Vad händer om det finns överlappande regler?.

RulesAndRecurrences

Namn Typ Obligatoriskt Beskrivning
Regler Regler Ja Nyckeln är en matris och varje element innehåller flera attribut i listan i tabellen i följande avsnitt. Matrisens storlek ska vara minst en.
RecurrencePattern String Inga Den här nyckeln är specifik för återkommande uppgifter. För tillfället har vi bara stöd för det här mönstret: FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA. BYDAY kan ändras till att omfatta färre dagar; med FREQ och INTERVAL kan inte ändras.
InnerCalendarId GUID Inga Den här nyckeln är för redigering. Om en regel redigeras måste InnerCalendarId skickas här. Om en InnerCalendarId inte passeras skapar API en ny regel, även om nyckeln IsEdit har angetts som sann.
Åtgärd Integer Inga Den här nyckeln är specifik för anpassade uppgifter. Om en anpassad återkommande text skapas eller redigeras ska ett av följande nummer anges:
  • (1) Lägga till en dag i upprepning
  • (2) Ta bort en dag från upprepning
  • (3) Redigera endast start- eller slutdatum eller tid, eller redigera kapacitet
  • (4) Redigera något annat än de nycklar som anges i (3)

Regler

Namn Type Obligatoriskt Beskrivning
StartTime Datum/tid Ja Nyckeln innehåller en datetime-post i ISO-format. Exempel: \"2021-05-15T12:00:00.000Z\" Tidsdelen avgör starttiden för arbetstimmarna i den tidszon som angavs tidigare. Datumdelen avgör arbetstimmars startdatum. Här, 15 maj 2021 är datumet för händelsen eller startdatum för återkommande. Om mönstren var, men BYDAY=TU,WE den 15 maj (en lördag) är datumet, skapar eller redigerar API-programmet automatiskt regler för alla tisdagar och onsdagar följande 15 maj. I det här fallet måste regeln inte ha det datum som motsvarar dagen.
EndTime Datum/tid Ja Denna innehåller en datetime-post i ISO-format. Exempel: \"2021-05-15T12:00:00.000Z\" Tidsdelen avgör sluttiden för arbetstimmarna i den tidszon som angavs tidigare. Datumdelen måste innehålla samma datum som datumdelen av StartTime. De enda undantagen är:
  • Om det är en heldagsförekomst. I det här fallet bör datumdelen reflektera slutdatum för hela dagen.
  • Händelsen avslutas i slutet av dagen, det vill säga 12:00 följande dag. I det här fallet ska datumet vara \"2021-05-16T00:00:00.000Z\". Om du vill ange slutdatum för återkommande ändrar du attributet RecurrenceEndDate.
WorkHourType Integer Ja Den här nyckeln innehåller en siffra som motsvarar ett av följande alternativ:
  • (0) Arbetar
  • (1) Rast
  • (2) Ledig
  • (3) Ledig tid
Insats Integer No Nyckeln avgör entitetens kapacitet. Det måste vara ett heltal. Standardvärdet är 1.

Utdata

Med POST-API skapas eller ändras kalenderregelposter för den valda entiteten. Dessutom visas följande utdata:

Namn Typ Beskrivning
InnerCalendarIds String En matris med InnerCalendarIds GUID som är ett resultat av POST-åtgärden.

Ta bort kalender-API

Indata

Namn Typ Obligatoriskt Beskrivning
EntityLogicalName String Ja I det här fältet beskrivs den entitet vars kalenderregler ska tas bort.
InnerCalendarId GUID Ja I det här fältet beskrivs ID:t för InnerCalendarId som måste tas bort. Om flera InnerCalendarId är associerade med en enskild regel räcker ett ID här. Mer information om inner- och yttre kalendrar: Kalenderentiteter
CalendarId GUID Ja I det här fältet beskrivs entitetens CalendarId.
IsVaried Boolean Inga Det här fältet är specifikt för återkommande och är inställt på yes om en anpassad återkommande regel tas bort.
UseV2 Flagga No Genom att godkänna den här flagga aktiveras V2-versionen av kalendern för arbetstid med en förbättrad överlappande regellogik som möjliggör flera återkommande. Mer information finns i Vad händer om det finns överlappande regler?.

Utdata

Med POST-API tar bort kalenderregelposter för den valda entiteten. Dessutom visas följande utdata:

Namn Type Beskrivning
InnerCalendarIds String En matris med InnerCalendarIds GUID som är ett resultat av POST-åtgärden.

Läs in kalender-API

Indata

Namn: msdyn_LoadCalendars
Typ: Åtgärd
Beskrivning: Returnerar kalendrar för given LoadCalendarsInput.

Namn: msdyn_LoadCalendars.LoadCalendarsInput
Typ: Parameter
Beskrivning: Sträng i följande JSON-format:

{
   StartDate: string,
   EndDate: string,
   CalendarIds: string[]
}

Namn: msdyn_LoadCalendarsResponse
Typ: ComplexType
Beskrivning: Innehåller svaret från msdyn_loadCalendars-åtgärden.

Namn: msdyn_LoadCalendarsResponse.CalendarEvents
Typ: Egenskap
Beskrivning: Sträng i följande JSON-format:

{
"calendarId": CalendarEventSlot[]
}

Där calendarId är en korrekt guide som representerar Guide för kalender och CalendarEventSlot är ett objekt av följande format:

{
  CalendarId: string,
  InnerCalendarId: string,
  Start: string,
  End: string,
  Effort: double
}

Hur du anropar API:er

Dessa API:er kan anropas med hjälp av webbläsaren.

  1. Öppna webbläsaren och den organisation där du behöver göra kalenderändringarna.
  2. Öppna utvecklarverktyg (välj Ctrl+Shift+I i Microsoft Edge, välj F12 i Google Chrome).
  3. Ange följande funktion i konsolen när du har ersatt [org-name] med organisationsinformation (till exempel http://your_org.crm.dynamics.com):
       function CalendarAction(action, data) {
           let req = new XMLHttpRequest();
           req.open("POST", "**[org-name]**/api/data/v9.0/" + action, true);
           req.setRequestHeader("OData-MaxVersion", "4.0");
           req.setRequestHeader("OData-Version", "4.0");
           req.setRequestHeader("Accept", "application/json");
           req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
           req.setRequestHeader("Prefer", 'odata.include-annotations="*"');
           req.onreadystatechange = function () {
               if (this.readyState === 4) {
                   req.onreadystatechange = null;
                   if(this.status == 200) {
                       console.log(JSON.parse(this.response));
                   } else {
                       console.error(JSON.parse(this.response));
                   }
               }
           };
           req.send(JSON.stringify(data));
       }
  1. När den här funktionen har definierats kan du anropa den för att skapa, redigera eller ta bort kalendrar med hjälp av API:er. Spara en kalender genom att ange följande samtal:
       CalendarAction("msdyn_SaveCalendar",{
           "CalendarEventInfo":"{
               \"CalendarId\":\"df0857c4-50f5-4576-8e89-f236670ad2d5\",
               \"EntityLogicalName\":\"bookableresource\",
               \"TimeZoneCode\":92,\"StartDate\":\"2021-04-25T00:00:00.000Z\",
               \"IsVaried\":false,
               \"RulesAndRecurrences\":[{
                   \"Rules\":[{
                       \"StartTime\":\"2021-04-25T08:00:00.000Z\",
                       \"EndTime\":\"2021-04-25T17:00:00.000Z\",
                       \"Duration\":540,
                       \"Effort\":1
                   }]
               }]
           }"
       })

Spara en kalender genom att ta bort följande samtal:

       CalendarAction("msdyn_DeleteCalendar", {
           "CalendarEventInfo":"{
               \"CalendarId\":\"8390358c-77d0-430f-b176-f27adadac8eb\",
               \"EntityLogicalName\":\"bookableresource\",
               \"InnerCalendarId\":\"cf508c2c-5c55-485c-be1e-d2ebcb385441\"
           }"
       })
       

I följande avsnitt finns exempel på hur du ringer olika samtal baserat på dina behov. Ersätt action av funktionsanropet i steg 3 med msdyn_SaveCalendar eller msdyn_DeleteCalendar och ersätt data med relevant CalendarEventInfo.

Se även följande skärmbild för en Power Automate uppmaning till msdyn_SaveCalendar åtgärd: Power Automate anropa msdyn_SaveCalendar-åtgärd.

Exempelscenarier för API-användning

Vi ska gå igenom några scenarier som du kan använda dessa API:er för.

Bob och Tim är lastbilschaufförer för Contoso Enterprises i Bellevue, Washington. Avsändaren, Debbie, ansvarar för att ändra sina arbetstimmarskalender. Han gör ändringarna med hjälp av API:erna msdyn_SaveCalendar och msdyn_DeleteCalendar.

Skapa arbetstidförekomst.

Bob kommer att köra runt och leverera paket från 9:00 till 17:00 den 15 maj 2021. Debbie använder msdyn_SaveCalendar API:et.

Begäran

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-15T09:00:00.000Z\",\"EndTime\":\"2021-05-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}]}]}"
}

Response

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

Redigera arbetstidförekomst.

Schemat för Bob börjar sedan klockan 10:00 den 15 maj 2021. Debbie använder msdyn_SaveCalendar API:et.

Begäran

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"IsEdit\":\"true\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-15T10:00:00.000Z\",\"EndTime\":\"2021-05-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}], \"InnerCalendarId\":\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"}]}"
}

Response

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

Ta bort arbetstidförekomst.

En familjekris kommer upp och Bob måste avbryta hela sin arbetsdag. Debbie använder msdyn_DeleteCalendar API:et.

Begär

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"InnerCalendarId\":\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"}"
}

Svar

{
  "InnerCalendarIds": "[\"f76cc333-cbbe-eb11-a81d-000d3a6e4359\"]"
}

Skapa daglig arbetstidförekomst

Med start 20 maj 2021 bestämmer sig Bob för att arbeta med Contoso hela veckan från 8:00 till 17:00 och slutar arbeta där den 15 juli 2021.

Begär

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RecurrenceEndDate\":\"2021-07-15T00:00:00.000Z\",\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T08:00:00.000Z\",\"EndTime\":\"2021-05-20T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\"}]}"
}

Svar

{
  "InnerCalendarIds": "[\"20f6cfa7-cfbe-eb11-a81d-000d3a6e4359\"]"
}

Redigera en daglig återkommande arbetstid med ökad kapacitet

Bob bestämmer sig för att sluta arbeta hela veckan den 15 juni 2021 och ta en paus. Tills dess kommer Bob att fortsätta med hela veckans schema som han tidigare godkände. Han gör ändringarna med hjälp av API msdyn_SaveCalendar.

Begäran

{
 "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RecurrenceEndDate\":\"2021-06-15T00:00:00.000Z\",\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T08:00:00.000Z\",\"EndTime\":\"2021-05-20T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"InnerCalendarId\":\"20f6cfa7-cfbe-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA\"}]}"
}

Response

{
  "InnerCalendarIds": "[\"867a2461-cdbe-eb11-a81d-000d3a6e4359\"]"
}

Skapa veckovis arbetstidförekomst

Från och med 16 juni 2021 arbetar Bob mellan 08:00 och 17:00 på onsdagar och fredagar. Han tar en paus från 12:00 till 12:30 för lunch. Debbie använder msdyn_SaveCalendar API, men hon gör ett misstag och schemalägger pausen från 12:00 till 13:00.

Begär

{
  "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-16T08:00:00.000Z\",\"EndTime\":\"2021-06-16T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}, {\"StartTime\":\"2021-06-16T12:00:00.000Z\",\"EndTime\":\"2021-06-16T13:00:00.000Z\",\"Effort\":null,\"WorkHourType\":1}, {\"StartTime\":\"2021-06-16T13:00:00.000Z\",\"EndTime\":\"2021-06-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,TH,FR\"}]}"
}

Svar

{
  "InnerCalendarIds": "[\"1f894441-d0be-eb11-a81d-000d3a6e4359\"]"
}

Redigera en rast från en veckovis arbetstidförekomst

Debbie korrigerar sedan sitt misstag och ändrar pausen till 12:00 till 12:30 med hjälp av msdyn_SaveCalendar API.

Begäran

{
  "CalendarEventInfo": "{\"CalendarId\":\"d33263c7-c16b-4e3e-a56a-20f7a66cafc1\",\"EntityLogicalName\":\"bookableresource\",\"IsEdit\":\"true\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-15T08:00:00.000Z\",\"EndTime\":\"2021-06-15T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}, {\"StartTime\":\"2021-06-15T12:00:00.000Z\",\"EndTime\":\"2021-06-15T12:30:00.000Z\",\"Effort\":null,\"WorkHourType\":1}, {\"StartTime\":\"2021-06-15T12:30:00.000Z\",\"EndTime\":\"2021-06-15T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"InnerCalendarId\":\"1f894441-d0be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE,TH,FR\"}]}"
}

Response

{
  "InnerCalendarIds": "[\"1f894441-d0be-eb11-a81d-000d3a6e4359\"]"
}

Skapa anpassad arbetstidförekomst

Tim arbetar för Contoso på måndagar mellan 08.00 och 17.00 och onsdagar 11.00 till 15.00. Tim började arbeta för Contoso den 16 maj 2021. Han använder msdyn_SaveCalendar API för att skapa Tims arbetstider.

Begäran

{
"CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"IsVaried\":true,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-16T08:00:00.000Z\",\"EndTime\":\"2021-05-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=MO\"},{\"Rules\":[{\"StartTime\":\"2021-05-16T11:00:00.000Z\",\"EndTime\":\"2021-05-16T15:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\"}]}"
}

Response

{
  "InnerCalendarIds": "[\"9fb8c199-d1be-eb11-a81d-000d3a6e4359\", \"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"]"
}

Redigera anpassad arbetstidförekomst

Tims schema ändras sedan till arbetstider från onsdag 17:00 till 20:00 och torsdag 10:00 till 12:00. Måndagen tas bort från Tim schema. Debbie använder msdyn_SaveCalendar API för att uppnå detta.

Begär

{
"CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"IsVaried\":true,\"IsEdit\":true,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-16T08:00:00.000Z\",\"EndTime\":\"2021-05-16T17:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":2,\"InnerCalendarId\":\"9fb8c199-d1be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=MO\"},{\"Rules\":[{\"StartTime\":\"2021-05-16T17:00:00.000Z\",\"EndTime\":\"2021-05-16T20:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":3,\"InnerCalendarId\":\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\",\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\"}, {\"Rules\":[{\"StartTime\":\"2021-05-16T10:00:00.000Z\",\"EndTime\":\"2021-05-16T12:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}],\"Action\":1,\"InnerCalendarId\":null,\"RecurrencePattern\":\"FREQ=WEEKLY;INTERVAL=1;BYDAY=TH\"}]}"
}

Svar

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\", \"942bda0f-d3be-eb11-a81d-000d3a6e4359\"]"
}

Redigera en arbetsttidförekomst i en upprepning

Den 26 maj 2021 kan Tim bara arbeta mellan 13:00 och 19:00. Debbie använder msdyn_SaveCalendar API:et här.

Begär

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-26T13:00:00.000Z\",\"EndTime\":\"2021-05-26T19:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}], \"InnerCalendarId\":\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"}]}"
}

Svar

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\"]"
}

Redigera anpassad arbetstidförekomst

Tim har bestämt sig för att lämna företaget och måste ta bort hela sitt schema. Debbie använder msdyn_DeleteCalendar API:et här.

Begär

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"InnerCalendarId\":\"34d2210c-9fb6-eb11-a820-000d3afb1dba\",\"IsVaried\":true}"
}

Svar

{
  "InnerCalendarIds": "[\"a2b8c199-d1be-eb11-a81d-000d3a6e4359\", \"942bda0f-d3be-eb11-a81d-000d3a6e4359\"]"
}

Skapa ledighet

Tim ska ta ledigt tre dagar på familjeledighet med start den 9 juni 2021.

Begäran

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"InnerCalendarDescription\":\"Family Vacation\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-06-15T00:00:00.000Z\",\"EndTime\":\"2021-06-17T00:00:00.000Z\",\"Effort\":1,\"WorkHourType\":3}]}]}"
}

Response

{
  "InnerCalendarIds": "[\"266c434e-d5be-eb11-a81d-000d3a6e4359\"]"
}

Skapa arbetstidförekomst hela dagen

Tim har ett 72-timmars skift från och med 20 maj 2021. Han använder msdyn_SaveCalendar API för att skapa Tims arbetstider.

Begär

{
 "CalendarEventInfo": "{\"CalendarId\":\"a68245c9-ba2e-4496-9c18-3bee75fda396\",\"EntityLogicalName\":\"bookableresource\",\"TimeZoneCode\":5,\"RulesAndRecurrences\":[{\"Rules\":[{\"StartTime\":\"2021-05-20T00:00:00.000Z\",\"EndTime\":\"2021-05-22T00:00:00.000Z\",\"Effort\":1,\"WorkHourType\":0}]}]}"
}

Svar

{
  "InnerCalendarIds": "[\"6e160a8e-d5be-eb11-a81d-000d3a6e4359\"]"
}

Vanliga frågor och svar om

Felmeddelandet "StartTime kan inte vara större eller lika med EndTime".

Kontrollera att det inte finns några överlappande tidsluckor för de olika kalenderreglerna. Kontrollera att datumen för att sökerställa StartTime inte senare EndTime. Kontrollera också att tiderna följer formatet som är dygnet runt.

Kan API:erna användas för att uppdatera entiteten "Arbetstimmarsmallar"?

Ja, du kan använda det här API:t för att skapa och uppdatera arbetstimmarsmallar förutom resursens arbetstider.

Ett felmeddelande visas: "Det uppstod en deserialisering av objektet av typen Microsoft.Dynamics.CALCalendar.Plugins.SaveCalendarConchedt+CalendarEventInfo. Indatakällan är inte korrekt formaterad.
or
Förväntar tillståndet "Element". "Text" påträffades med namnet "namnrymd''."

Kontrollera att strängen är korrekt parsad. Det kan finnas saknade parenteser, komma eller semikolon.

Felmeddelandet "Ogiltigt återkommande mönster" visas. Se dokumentationen för mönster som stöds".

För tillfället har vi bara stöd för det här mönstret: FREQ=DAILY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA. BYDAY kan ändras till att omfatta färre dagar; med FREQ och INTERVAL kan inte ändras. Kontrollera att det inte finns några blanksteg i mönstren.

Hur får vi information om kalender-ID:t och resursens InnerCalendarId?

CalendarId hämtas från resursattribut. Ring det här samtalet om du vill ha följande information: [org-url]/api/data/v9.1/bookableresources([bookableresourceGUID]).

Ett exempel på det föregående samtalet är [org-url]/api/data/v9.1/bookableresources(7bb0224b-6712-ec11-94f9-000d3a6d888e).

InnerCalendarId hämtas från kalenderattribut. Ring det här samtalet om du vill ha följande information: [org-url]/api/data/v9.1/calendars([calendar-id-from-above-call])?$expand=calendar_calendar_rules.

Ett exempel på det föregående samtalet är [org-url]/api/data/v9.1/calendars(02481736-1b6a-4d49-9ebd-a5bd041c1c99)?$expand=calendar_calendar_rules.

Vad händer om det finns överlappande regler?

Det finns några olika rankningar som regler faller under:

  • Rangordning 1 – daglig förekomst (fungerar/fungerar inte) och förekommande ledighet.
  • Rangordning 0 – återkommande per vecka (arbete/icke-arbete).

V2 överlappande regler

  • Reglerna för Rangordning 1 har högre prioritet än reglerna för Rangordning 0. om det finns två regler (en av varje rank) på samma dag, gäller den dagliga händelsen eller återkommande händelsen för den veckovisa återkommande händelsen.
  • När det finns flera Rangordna 0-regler inom samma datumintervall:
    • Om tiderna inte korsar varandra, kommer de båda att finnas kvar i kalendern.
    • Om tiderna korsar varandra används regeln som senast skapades/ändrades för resursens kalender. Alla andra korsande regler i datumintervallet tas bort. Om vissa regler av rangordning 0 har olika datum, men inte andra, kommer regeln delas så att avsnitten som inte korsas samman behålls, medan de korsade delarna tas bort.

Exempel på beteende i V2-kalendern:

Exempel 1 – Upprepa arbetstider: Överlappande datum utan överlappande dagar/tider

En tekniker arbetar en viss tidsperiod på förmiddagar, eftermiddagar eller nätter under olika dagar.

  1. Skapa en första återkommande kalenderregel för ett visst datumintervall. Till exempel: Upprepa mån, tis; 1.1-4.1; 08:00-17:00 ET.

  2. Skapa en andra återkommande kalenderregel för ett datumintervall som korsas, samtidigt som du ser till att arbetstiderna inte korsas med föregående dagar eller tider. Till exempel: Upprepa ons, tors; 1.1-4.1; 08:00-17:00 ET eller Upprepa mån, tis; 1.1-4.1; 17:00-20:00 ET.

Resultat: Båda kalenderreglerna finns kvar och finns tillsammans med varandra.

Exempel 2 – Återkommande arbetstider: Vissa överlappande datum med alla överlappande dagar och andra regler som börjar/slutar före eller efter den första regeln

En tekniker får ett nytt arbetsschema som ersätter några veckor av det gamla schemat. I enlighet med kontrakt arbetar de alltid samma dagar varje vecka.

  1. Skapa en första återkommande kalenderregel för ett visst datumintervall. Till exempel: Upprepa mån, tis; 2.1-4.1; 08:00-17:00 ET.

  2. Skapa en andra återkommande kalenderregel för ett överlappande datumintervall där alla dagar har överlappande arbetstider. Välj start-/slutdatum för den nya regeln som ska vara före eller efter start-/slutdatum för regeln. Till exempel: Upprepa mån, tis; 3.1-5.1; 13:00-20:00 ET.

Resultat: Den första regeln trunkeras så att start- och slutdatum för den andra regeln finns. Till exempel: Upprepa mån, tis; 2.1-2.28; 08:00-17:00 ET OCH Upprepa mån, tis; 3.1-5.1; 13:00-20:00 ET.

Exempel 3 – Upprepa arbetstider: Alla överlappande datum med några överlappande dagar/tider

Teknikern är en kontraktarbetare för en fast tvåmånadersperiod. De har gått med på att göra ytterligare arbete under några dagar. De vill flytta tisdagens arbetstider till en tidigare/senare tidpunkt.

  1. Skapa några återkommande kalenderregler för ett visst datumintervall. Till exempel: Upprepa mån, tis; 2.1-4.1; 8:00-12:00 ET OCH Upprepa tis, ons; 2.1-4.1; 13:00-20:00 ET.

  2. Skapa en ny återkommande kalenderregel för samma datumintervall. Välj dagar/tider som delvis överlappar med de ursprungliga reglerna. Till exempel: Upprepa tis, tors ; 2.1-4.1; 10:00-14:00 ET.

Resultat: Den nya regeln skriver över den gamla regeln där det finns överlappningar och de övriga lämnas oförändrade. Till exempel: Upprepa mån; 2.1-4.1; 08:00-12:00 ET OCH Upprepa ons; 2.1-4.1; 13:00-17:00 ET OCH Upprepa tis, tors; 2.1-4.1; 10:00-14:00 ET.

Exempel 4 – Upprepa arbetstider: Nya regeldatum inom den gamla regeln, vissa överlappande dagar/tider

En tekniker arbetar 08.00-17.00, mån-fre varje vecka. Bara i två veckor kommer de att ta hand om ett specialprojekt var för sig, mån-ons med olika arbetstider 06.00-18.00.

  1. Skapa en första återkommande kalenderregel för ett visst datumintervall. Till exempel: Upprepa mån, tis, ons, tors, fre; 1.1-Inget slutdatum, 08:00-17:00 ET.

  2. Skapa en andra återkommande kalenderregel som finns inom datumintervallet ovan, välj arbetstider som överlappar vissa dagar. Till exempel: Upprepa mån, tis, ons; 5.1-5.14; 06:00-18:00 ET.

Resultat: Kalendern ska ha fyra återkommande regler i slutet av den här övningen:

  • trunkera den första regeln till den andra regelns startdatum
  • den andra kalenderregeln
  • skapa en ny regel som påminner om den första regeln, men med datumen för den andra regeln för de dagar som inte överlappar
  • trunkera den första regeln för att börja från slutdatumet för den andra regeln, utan slutdatum

Till exempel: Upprepa mån, tis, ons, tors, fre; 1.1–4.30; 08:00-17:00 ET OCH Upprepa mån, tis, ons; 5.1-5.14; 06:00-18:00 ET OCH Upprepa tors, fre, 5.1-5.14; 08:00-17:00 ET OCH Upprepa mån, tis, ons, tors, fre; 5.15–Inget slutdatum; 08:00-17:00 ET

Exempel 5 – Icke-återkommande arbetstider (förekomst, rangordning 1-regel)

En tekniker har ett antal teamdagar som har överordning över alla andra arbetstimmars instanser för dagen.

  1. Skapa en återkommande kalenderregel för ett visst datumintervall. Till exempel: Upprepa mån, tis, ons, tors, fre; 1.1-Inget slutdatum, 08:00-17:00 ET.

  2. Skapa en icke-upprepande kalenderregel inom datumintervallet ovan. Välj arbetstimmar som överlappar vissa dagar. Till exempel: Ej upprepa; 6.21; 07:00-13:00 ET.

Resultat: Kalendern ska ha en regel som inte upprepas (förekomst) i slutet av övningen. Regeln som inte upprepar åsidosätter den överlappande upprepande händelsen för hela dagen. Till exempel: Upprepa mån, tis, ons, tors, fre; 1.1-Inget slutdatum förutom 6.21; ej upprepa; 6.21; 07:00-13:00 ET.

V1 överlappande regler

  • Reglerna för Rangordning 1 har högre prioritet än reglerna för Rangordning 0. Så om det finns två regler (en av varje rank) på samma dag, gäller den dagliga händelsen eller återkommande händelsen för den veckovisa återkommande händelsen.
  • Om det finns två regler av samma rangordning används regeln som senast skapades/ändrades för resursens kalender.
  • Tänk på att alla dagliga förekomster är av Rangordning 1, så du kanske vill överväga att ändra det till en återkommande vecka för att kunna lägga till förekomstarbetstider och få dem att fungera.
  • När en arbetstid existerar och en ledighet inträffar som överlappar den, delas reglerna på ett sätt som säkerställer att ledigheten respekteras, och eventuell återstående tid som arbetstid kommer att förbli som den är. Till exempel, om det finns arbetstid från 08:00 till 17:00 den 21 september, och en förekommande ledighet läggs till från 15:00 till 19:00 den 21 september, skulle detta lösas som arbetstid som 20:00 till 15:00 och ledigt från 15:00 till 19:00. Men om reglerna skapades i motsatt ordning (ledighet skapades först och sedan arbetstimmar skapades) oberoende av tidsluckorna skulle endast arbetstiden väljas om. Ledigheten skulle åsidosättas.

Tidszonskoder

Enum Tidszon
0 (GMT-12:00) Internationella datumlinjen, väst
1 (GMT+13:00) Samoa
2 (GMT-10:00) Hawaii
3 (GMT-09:00) Alaska
4 (GMT-08:00) Pacific Time (USA och Kanada)
5 (GMT-08:00) Baja California
6 (GMT-11:00) UTC-tid-11
7 (GMT-10:00) Aleuterna
8 (GMT-09:30) Marquesas, Marquesasöarna
9 (GMT-09:00) UTC-tid-09
10 (GMT-07:00) Mountain Time (USA och Kanada)
11 (GMT-08:00) UTC-tid-08
12 (GMT-07:00) Chihuahua, La Paz, Mazatlan
15 (GMT-07:00) Arizona
20 (GMT-06:00) Central Time (USA och Kanada)
25 (GMT-06:00) Saskatchewan
29 (GMT-06:00) Guadalajara, Mexico City, Monterrey
33 (GMT-06:00) Centralamerika
34 (GMT-06:00) Påskön
35 (GMT-05:00) Eastern Time (USA och Kanada)
40 (GMT-05:00) Indiana (östra)
43 (GMT-05:00) Haiti
44 (GMT-05:00) Havanna
45 (GMT-05:00) Bogota, Lima, Quito, Rio Branco
47 (GMT-04:00) Caracas
50 (GMT-04:00) Atlanttid (Kanada)
51 (GMT-05:00) Turks- och Caicosöarna
55 (GMT-04:00) Georgetown, La Paz, San Juan
56 (GMT-04:00) Santiago
58 (GMT-04:00) Cuiaba
59 (GMT-04:00) Asunción
60 (GMT-03:30) Newfoundland
65 (GMT-03:00) Brasilia
69 (GMT-03:00) Buenos Aires
70 (GMT-03:00) Cayenne, Fortaleza
71 (GMT-03:00) Salvador
72 (GMT-03:00) Saint Pierre och Miquelon
73 (GMT-03:00) Grönland
74 (GMT-03:00) Montevideo
75 (GMT-02:00) Mittatlanten
76 (GMT-02:00) UTC-tid-02
77 (GMT-03:00) Araguaina
80 (GMT-01:00) Azorerna
83 (GMT-01:00) Cabo Verde
84 (GMT+01:00) Casablanca
85 (GMT+00:00) Dublin, Edinburgh, Lissabon, London
90 (GMT+00:00) Monrovia, Reykjavik
92 (GMT) Coordinated Universal Time
95 (GMT+01:00) Belgrad, Bratislava, Budapest, Ljubljana, Prag
100 (GMT+01:00) Sarajevo, Skopje, Warszawa, Zagreb
105 (GMT+01:00) Bryssel, Köpenhamn, Madrid, Paris
110 (GMT+01:00) Amsterdam, Berlin, Bern, Rom, Stockholm, Wien
113 (GMT+01:00) Västra centralafrika
115 (GMT+02:00) Chisinau
120 (GMT+02:00) Kairo
125 (GMT+02:00) Helsingfors, Kiev, Riga, Sofia, Tallin, Vilnius
129 (GMT+02:00) Amman
130 (GMT+02:00) Aten, Bukarest
131 (GMT+02:00) Beirut
133 (GMT+02:00) Damaskus
134 (GMT+03:00) Istanbul
135 (GMT+02:00) Jerusalem
140 (GMT+02:00) Harare, Pretoria
141 (GMT+02:00) Windhoek
142 (GMT+02:00) Gaza, Hebron
145 (GMT+03:00) Moskva, S:t Petersburg
150 (GMT+03:00) Kuwait, Riyadh
151 (GMT+03:00) Minsk
155 (GMT+03:00) Nairobi
158 (GMT+03:00) Bagdad
159 (GMT+02:00) Kaliningrad
160 (GMT+03:30) Teheran
165 (GMT+04:00) Abu Dhabi, Muscat
169 (GMT+04:00) Baku
170 (GMT+04:00) Jerevan
172 (GMT+04:00) Port Louis
173 (GMT+04:00) Tbilisi
174 (GMT+04:00) Izhevsk, Samara
175 (GMT+04:30) Kabul
176 (GMT+04:00) Astrachan, Uljanovsk
180 (GMT+05:00) Jekaterinburg
184 (GMT+05:00) Islamabad, Karachi
185 (GMT+05:00) Tasjkent
190 (GMT+05:30) Chennai, Kolkata, Mumbai, New Delhi
193 (GMT+05:45) Kathmandu
195 (GMT+06:00) Astana
196 (GMT+06:00) Dhaka
197 (GMT+06:00) Omsk
200 (GMT+05:30) Sri Jayawardenepura
201 (GMT+07:00) Novosibirsk
203 (GMT+06:30) Yangon (Rangoon)
205 (GMT+07:00) Bangkok, Hanoi, Djakarta
207 (GMT+07:00) Krasnojarsk
208 (GMT+07:00) Barnaul, Gorno-Altajsk
209 (GMT+07:00) Hovd
210 (GMT+08:00) Beijing, Chongqing, Hongkong, Urumqi
211 (GMT+07:00) Tomsk
215 (GMT+08:00) Kuala Lumpur, Singapore
220 (GMT+08:00) Taipei
225 (GMT+08:00) Perth
227 (GMT+08:00) Irkutsk
228 (GMT+08:00) Ulaanbaatar
229 (GMT+09:00) Pyongyang
230 (GMT+09:00) Söul
231 (GMT+08:45) Eucla
235 (GMT+09:00) Osaka, Sapporo, Tokyo
240 (GMT+09:00) Jakutsk
241 (GMT+09:00) Tjita
245 (GMT+09:30) Darwin
250 (GMT+09:30) Adelaide
255 (GMT+10:00) Canberra, Melbourne, Sydney
260 (GMT+10:00) Brisbane
265 (GMT+10:00) Hobart
270 (GMT+10:00) Vladivostok
274 (GMT+10:30) Lord Howeön
275 (GMT+10:00) Guam, Port Moresby
276 (GMT+11:00) Bougainvilleön
277 (GMT+11:00) Norfolkön
278 (GMT+11:00) Sachalin
279 (GMT+11:00) Chokurdakh
280 (GMT+11:00) Solomonöarna, Nya Kaledonien
281 (GMT+11:00) Magadan
284 (GMT+12:00) UTC-tid+12
285 (GMT+12:00) Fijiöarna
290 (GMT+12:00) Auckland, Wellington
295 (GMT+12:00) Anadyr, Petropavlovsk-Kamtjatka
299 (GMT+12:45) Chathamöarna
300 (GMT+13:00) Nuku'alofa
301 (GMT-05:00) Chetumal
302 (UTC+02:00) Khartoum
303 (GMT-03:00) Punta Arenas
304 (GMT + 04:00) Volgograd
305 (GMT-07:00) Yukon