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:
|
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:
|
WorkHourType | Integer | Ja | Den här nyckeln innehåller en siffra som motsvarar ett av följande alternativ:
|
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.
- Öppna webbläsaren och den organisation där du behöver göra kalenderändringarna.
- Öppna utvecklarverktyg (välj Ctrl+Shift+I i Microsoft Edge, välj F12 i Google Chrome).
- 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));
}
- 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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 |