Споделяне чрез


Редактирайте календари за работен час, като използвате API

Организациите често се нуждаят от програмно създаване, редактиране или изтриване на работното време в календарите на своите ресурси. Календарите показват работно време, почивки и почивки, които определят наличността на ресурс, когато работата е планирана. Тези ресурси трябва да бъдат насрочени в определени часови зони, могат или не могат да наблюдават затваряне на бизнеса и могат да имат променлив капацитет. За информация относно дефинирането на работни часове в приложението "Полева услуга" отидете на Добавяне на работни часове към ресурс, който може да се резервира.

В допълнение към използването на приложението Field Service, можете да използвате следните API, за да промените правилата на календара за избрани типове записи:

  • API за записване на календар (msdyn_SaveCalendar) създава или актуализира календарни записи на избран обект въз основа на входните данни, подадени като заявка.
  • API за изтриване на календар (msdyn_DeleteCalendar) изтрива всички вътрешни календарни правила на календар на избран обект въз основа на входните данни, подадени като заявка.
  • Save/Delete Calendar API V2 (msdyn_SaveCalendar/msdyn_DeleteCalendar, pass flag UseV2) позволява повтаряне на няколко работни часа едновременно, като променя логиката за припокриване на правила. За повече информация вижте Какво се случва, ако има припокриващи се правила?.

Тази статия съдържа подробности за входа (заявката) и изхода (отговора) на всеки API и тяхното използване с примери.

Предварителни изисквания

  • Версия на платформата 9.2.21055 или по-нова с версия 3.12.45.7 за планиране на универсални ресурси.
  • Използване на един от следните типове записи:
    • Ресурс, който може да се резервира (ресурс, който може да се резервира)
    • Изискване за ресурси (msdyn_resourcerequirement)
    • Шаблон за работно време (msdyn_workhourtemplate)
    • Проект (msdyn_project)

Типове събития в календара

Когато създавате календар, вие определяте колко пъти се появява даден тип работен час – веднъж, цял ден, всяка седмица или всеки ден, или можете да създадете повторение по избор. За повече информация относно тези събития в календара отидете на примерите по-долу в тази статия.

Екземпляр

Когато тип работен час се появява само веднъж в календара на обекта, той се нарича събитие.

Например, помислете за ресурс, работещ от 5:00 ч. До 10:00 ч. На 26 май 2021 г. Тези API поддържат само този тип събития, които започват и завършват в рамките на същия ден. За друг пример, помислете за ресурс, работещ от 26 май 2021 г. в 20:00 ч. 10:00 ч. На 27 май 2021 г. Не можете да създадете това повторение, като използвате само едно извикване на msdyn_SaveCalendar API; вместо това трябва да направите две повиквания.

Появяване през целия ден

Когато се появи тип работен час за един или повече цели дни, започвайки от полунощ (12:00 ч.) от началната дата, това е целодневно събитие. Максималната продължителност за цял ден е пет години.

Например, ресурс работи през целия ден от 26 май 2021 г. до края на деня на 30 май 2021 г. Това е явление през целия ден, което продължава пет дни.

Ежеседмична повторяемост

Когато даден тип работен час се появява по едно и също време в избрани дни от всяка седмица, това се нарича седмичен рецидив.

Например ресурсът работи от 5:00 до 10:00 часа всеки понеделник, вторник и сряда.

Дневна повторяемост

Когато типът работен час се появява по едно и също време всеки ден, той се нарича ежедневен рецидив.

Например ресурсът работи от 5:00 до 10:00 часа всеки ден от седмицата.

Персонализирано повторение

Когато даден тип работен час се появява в определени часове в определени дни от седмицата, но часовете са различни в различните дни, можете да създадете повторение поизбор.

Например ресурсът работи от 5:00 до 10:00 часа всеки понеделник и от 12:00 до 15:00 всяка сряда.

Типове работен час

Тези API поддържат създаване, актуализиране и изтриване на операции за следните типове работни часове:

Работни часове

Работното време е време, през което дадено предприятие е на разположение за извършване на работа.

Използвайки тези API, можете да направите следното:

  • Създайте, редактирайте или изтрийте събитие за работен час.
  • Създайте, редактирайте или изтрийте дневно повторение на работен час.
  • Създайте, редактирайте или изтрийте седмично повторение на работен час.
  • Създайте, редактирайте или изтрийте персонализирано повторение на работен час.
  • Създайте, редактирайте или изтрийте целодневни работни часове.
  • Създайте или редактирайте капацитет в работно време.
  • Редактирайте единичен работен час в повторение.
  • Редактиране на това и следващите събития в повторение.
  • Променете появата на работен час на повторение.
  • Променете часова зона за правилото на календара.

Използвайки този API, можете да направите следното:

  • Изтриване на единичен работен час от повторение.
  • Създайте събитие, което обхваща 24 часа, но не започва и завършва в полунощ (00:00 ч.).
  • Създайте, редактирайте или изтрийте целодневни повторения.

Неработно време

Това са моменти, през които обектът не е достъпен за работа поради неуточнена причина.

Използвайки тези API, можете да направите следното:

  • Създаване или редактиране на целодневно неработно време.
  • Създаване или редактиране на събитие в неработен час.
  • Променете часова зона за правилото на календара.

Използвайки тези API, не можете да направите следното:

  • Създаване или редактиране на повторение на неработен час.

Почивка

Това са часове в работния ден, през които дадено предприятие прави почивка и не е на разположение за работа. Прекъсванията не могат да съществуват без работно време; те трябва да се случват между два работни часа на ден. Прекъсванията не могат да се припокриват с работното време.

Използвайки тези API, можете да направите следното:

  • Създайте или редактирайте почивки по време на работни часове.

Използвайки тези API, не можете да направите следното:

  • Изтрийте само почивки от възникване или повтаряне на работното време.

Неактивно време

Това са моменти, през които обект не е достъпен за работа поради ваканция. Причината за свободното време може да бъде посочена.

Използвайки тези API, можете да направите следното:

  • Създайте или редактирайте свободно време с етикет.
  • Променете часова зона за правилото на календара.

Използвайки тези API, не можете да направите следното:

  • Създайте или редактирайте повторение на неработен час.

Закриване на бизнес дейност

Можете да създадете обекти за закриване на бизнес, които определят часовете на затваряне на бизнеса. С помощта на API можете да настроите всеки обект да наблюдава или игнорира времето за затваряне на бизнеса на msdyn_SaveCalendar организацията, като използвате опционалния ключ ObserveClosure . Когато са настроени да наблюдават тези затваряния, обектите не са на разположение за работа.

Записване на API на календара

Въвеждане

Искането съдържа само един атрибут – CalendarEventInfo, който е тип низ . Той съдържа няколко други атрибута, които са вградени в този низ.

Бележка

В следващата таблица Type представя формата, който се очаква да направи успешно искане. Цялата заявка обаче се анализира като един низ.

CalendarEventInfo

Име Тип Изисква Описание
EntityLogicalName String Да Този ключ описва обекта, от който се извиква API. Календарът на този обект трябва да бъде създаден или редактиран.
CalendarId GUID Да Този ключ съдържа идентификатора на календара, свързан с обекта, описан по-горе. Когато се създаде някой от тези обекти, автоматично се създава и запис в календара. Тези приложни програмни интерфейси редактират този календарен запис, като добавят правила или редактират съществуващи правила.
RulesAndRecurrences RulesAndRecurrences Да Този ключ е масив и всеки елемент съдържа множество атрибути, както са изброени в таблицата в следващия раздел. Размерът на масива трябва да бъде поне един.
IsVaried Boolean No Този ключ трябва да бъде зададен true на за персонализирани сценарии на повторяемост.
IsEdit Boolean No Този ключ трябва да true бъде настроен на за редактиране на съществуващи правила.
TimeZoneCode Integer No Този ключ приема целочислена стойност, съответстваща на часовата зона за правилата на календара. За съпоставянето отидете на Кодове на часови зони по-нататък в тази статия. Стойността по подразбиране е часовата зона на потребителя.
InnerCalendarDescription String No Този ключ е необходим само ако правилото на календара е за свободно време. Той трябва да съдържа причината за свободното време.
ObserveClosure Boolean No Този ключ е специфичен за рецидиви. Ако е зададено true, предприятието наблюдава закриване на стопанска дейност.
RecurrenceEndDate ДатаЧас No Този ключ е специфичен за рецидиви. Той съдържа крайната дата за повторение. Ако клеймото за време е 08:00:00 или по-рано, крайната дата за повторение е един ден преди посочената дата. Ако клеймото за време е 08:00:01 или по-късно, датата се зачита такава, каквато е. Стойността по подразбиране за повторения е нула. Стойността по подразбиране за повторения е 30 Dec 9999, 23:59:59 часа, UTC.
RecurrenceSplit Boolean No Този ключ е специфичен за рецидиви. Той е настроен на true за редактиране на "Това и следващите събития" на повторение.
ResourceId GUID No Този ключ съдържа SystemUserId или ResourceIdи трябва да се предава само когато обектът, свързан с това повикване, е ресурс, който може да се резервира, от тип SystemUser . Това е необходимо, за да проверите за привилегии на OwnCalendar в раздела Управление на услуги .
УпотребаV2 Флаг No Преминаването на този флаг позволява V2 версията на календара на работните часове, с подобрена логика на припокриващите се правила, позволяваща множество повторения. За повече информация вижте Какво се случва, ако има припокриващи се правила?.

RulesAndRecurrences

Име Тип Необходимо Описание
Правила Правила Да Този ключ е масив и всеки елемент съдържа множество атрибути, както са изброени в таблицата в следващия раздел. Размерът на масива трябва да бъде поне един.
RecurrencePattern String No Този ключ е специфичен за рецидиви. В момента поддържаме само този модел: FREQ=WEEKLY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA BYDAY могат да бъдат променени, за да включват по-малко дни; Въпреки това, FREQ и INTERVAL не може да бъде променен.
InnerCalendarId GUID No Този ключ е специфичен за редактиране. Ако се редактира правило, InnerCalendarId трябва да бъде предаден тук. Ако не бъде предаден InnerCalendarId , API създава ново правило, дори ако ключът IsEdit е настроен на истина.
Действие Integer No Този ключ е специфичен за персонализирани повторения. Ако се създава или редактира персонализирано повторение, трябва да се въведе един от следните числа:
  • (1) Добавяне на ден към повторението
  • (2) Изтриване на ден от повторението
  • (3) Редактиране само на начална или крайна дата или час или капацитет за редактиране
  • (4) Редактиране на нещо различно от ключовете, споменати в (3)

Правила

Име Тип Необходимо Описание
StartTime ДатаЧас Да Този ключ съдържа запис за дата и час в ISO формат. Например, \"2021-05-15T12:00:00.000Z\". Часовата част определя началния час на работния час в часовата зона, посочена по-рано. Частта с датата определя началната дата на работния час. Тук 15 май 2021 г. е датата на настъпването или началната дата на повторението. Ако моделът е бил, но 15 май (събота) е BYDAY=TU,WE датата, API автоматично ще създаде или редактира правила за всички вторник и сряда след 15 май. Това е случаят, когато правилото не трябва да има датата, съответстваща на деня.
EndTime ДатаЧас Да Това съдържа запис за дата и час в ISO формат. Например, \"2021-05-15T12:00:00.000Z\". Часовата част определя крайния час на работния час в часовата зона, посочена по-рано. Частта с дата трябва да съдържа същата дата като частта от датата на началния час. Единствените изключения са:
  • Ако става въпрос за цял ден. В този случай датата трябва да отразява крайната дата на появата през целия ден.
  • Появата приключва в края на деня, т.е. 00:00 ч. На следващия ден. В този случай датата трябва да бъде \"2021-05-16T00:00:00.000Z\". За да зададете крайната дата на повторението, променете атрибута RecurrenceEndDate .
WorkHourType Integer Да Този ключ съдържа номер, съответстващ на една от следните опции:
  • (0) Работи
  • (1) Почивка
  • (2) Неработещи
  • (3) Неактивно време
Усилие Integer No Този ключ определя капацитета на обекта. Трябва да е цяло число. Стойността по подразбиране е 1.

Резултат

Този POST API създава или модифицира записи на календарни правила за избрания обект. Той също така дава следния изход.

Име Тип Описание
InnerCalendarIds String Масив от GUID на InnerCalendarIds , които са резултат от операцията POST.

Изтриване на API на календара

Въвеждане

Име Тип Изисква Описание
EntityLogicalName String Да Това поле описва обекта, чиито календарни правила трябва да бъдат изтрити.
InnerCalendarId GUID Да Това поле описва ИД на ИД на вътрешен календар, който трябва да бъде изтрит. Ако има няколко InnerCalendarIds , свързани с едно правило, всеки един идентификатор е достатъчен тук. Повече информация за вътрешните и външните календари: Обекти на календара
CalendarId GUID Да Това поле описва ИД на календара на обекта.
IsVaried Boolean No Това поле е специфично за повторяемост и е зададено на yes ако се изтрива правило за повторяемост по избор.
УпотребаV2 Флаг No Преминаването на този флаг позволява V2 версията на календара на работните часове, с подобрена логика на припокриващите се правила, позволяваща множество повторения. За повече информация вижте Какво се случва, ако има припокриващи се правила?.

Резултат

Този POST API изтрива записи на календарни правила за избрания обект. В допълнение също така дава следния изход.

Име Тип Описание
InnerCalendarIds String Масив от GUID на InnerCalendarIds , които са резултат от операцията POST.

Зареждане на API за календар

Въвеждане

Име: msdyn_LoadCalendars
Тип: Действие
Описание: Връща календари за даден LoadCalendarsInput.

Име: msdyn_LoadCalendars.LoadCalendarsInput
Тип: Параметър
Описание: Низ в следния JSON формат:

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

Име: msdyn_LoadCalendarsResponse
Тип: КомплексТип
Описание: Съдържа отговора от msdyn_loadCalendars действие.

Име: msdyn_LoadCalendarsResponse.КалендарСъбития
Тип: Имот
Описание: Низ в следния JSON формат:

{
"calendarId": CalendarEventSlot[]
}

Където calendarId е правилен guid, представляващ Guid на календара, а CalendarEventSlot е обект със следния формат:

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

Как да извикате API

Тези API могат да бъдат извикани с помощта на браузъра.

  1. Отворете браузъра и организацията, в която трябва да направите тези промени в календара.
  2. Отворете инструментите за разработчици (изберете Ctrl Shift+I+ , изберете Microsoft Edge F12 в Google Chrome).
  3. В конзолата въведете следната функция, след като заместите [org-name] с подробни данни за организацията (например, 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. След като тази функция е дефинирана, можете да я извикате за създаване, редактиране или изтриване на календари с помощта на API. Въведете следното повикване, за да запишете календар:
       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
                   }]
               }]
           }"
       })

Въведете следното повикване, за да изтриете календар:

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

Вижте следващия раздел за примери за това как да осъществявате различни повиквания според вашите нужди. Заменете извикването action на функцията в стъпка 3 с msdyn_SaveCalendar or msdyn_DeleteCalendar и заменете data със съответното CalendarEventInfo.

Вижте също следната екранна снимка за призив за Power Automate msdyn_SaveCalendar действие: Power Automate Призив за msdyn_SaveCalendar действие.

Примерни сценарии за използване на API

Нека да разгледаме някои сценарии, за които можете да използвате тези API.

Боб и Тим са шофьори на камиони за доставка за Contoso Enterprises в Белвю, Вашингтон. Техният диспечер, Деби, е отговорен за извършването на промени в календарите им за работно време. Деби прави тези промени, msdyn_SaveCalendar като използва и msdyn_DeleteCalendar API.

Създайте повторение на работен час.

Предвидено е Боб да обикаля, за да доставя пакети от 9:00 до 17:00 на 15 май 2021 г. Деби използва msdyn_SaveCalendar API.

Заявка

{
 "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}]}]}"
}

Отговор

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

Редактирайте повторение на работен час.

След това графикът на Боб се променя, за да започне в 10:00 ч. На 15 май 2021 г. Деби използва msdyn_SaveCalendar API.

Заявка

{
 "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\"}]}"
}

Отговор

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

Изтрийте повторение на работен час.

Идва извънредна ситуация в семейството и Боб трябва да отмени цял работен ден. Деби използва msdyn_DeleteCalendar API.

Заявка

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

Отговор

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

Създайте ежедневно повторение на работен час

От 20 май 2021 г. Боб решава да работи с Contoso цяла седмица от 8:00 до 17:00 часа и ще спре да работи там на 15 юли 2021 г.

Заявка

{
 "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\"}]}"
}

Отговор

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

Редактирайте ежедневен рецидив на работен час с увеличен капацитет

Боб решава да спре да работи за цялата седмица от 15 юни 2021 г., за да си вземе почивка. Дотогава Боб ще продължи целоседмичния график, както беше договорено по-рано. Деби прави тези промени, msdyn_SaveCalendar като използва API.

Заявка

{
 "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\"}]}"
}

Отговор

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

Създайте ежеседмично повторение на работен час

Започвайки от 16 юни 2021 г., Боб ще работи от 8:00 до 17:00 часа в сряда и петък и ще си вземе почивка от 12:00 до 12:30 часа за обяд. Деби използва msdyn_SaveCalendar API, но прави грешка и планира почивката от 12:00 до 13:00 часа.

Заявка

{
  "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\"}]}"
}

Отговор

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

Редактиране на почивка от седмично повторение на работен час

След това Деби коригира грешката и променя почивката, за да се случи от 12:00 до 12:30 часа, msdyn_SaveCalendar като използва API.

Заявка

{
  "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\"}]}"
}

Отговор

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

Създайте персонализирано повторение на работен час

Тим работи за Contoso в понеделник от 8:00 до 17:00 часа и в сряда от 11:00 до 15:00 часа. Тим започна работа по Contoso на 16 май 2021 година. Деби използва API, msdyn_SaveCalendar за да създаде работното време на Тим.

Заявка

{
"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\"}]}"
}

Отговор

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

Редактирайте персонализирано повторение на работен час

След това графикът на Тим се променя на работното време от сряда 17:00 до 20:00 часа и четвъртък от 10:00 до 12:00 часа. Понеделник е изваден от графика на Тим. Деби използва API, msdyn_SaveCalendar за да постигне това.

Заявка

{
"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\"}]}"
}

Отговор

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

Редактирайте повторение работен час в повторение

На 26 май 2021 г. Тим може да работи само от 13:00 до 19:00 часа. Деби използва msdyn_SaveCalendar API тук.

Заявка

{
 "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\"}]}"
}

Отговор

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

Изтрийте персонализирано повторение на работен час

Тим е решил да напусне компанията и трябва да изтрие целия им график. Деби използва msdyn_DeleteCalendar API тук.

Заявка

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

Отговор

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

Създаване на неработно време

Тим ще си вземе три почивни дни за семейна ваканция, започваща на 9 юни 2021 г.

Заявка

{
 "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}]}]}"
}

Отговор

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

Създайте целодневно работно време

Тим има 72-часова смяна, започваща на 20 май 2021 г. Деби използва API, msdyn_SaveCalendar за да създаде работното време на Тим.

Заявка

{
 "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}]}]}"
}

Отговор

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

Често задавани въпроси за

Получавам грешката: "Началният час не може да бъде по-голям или равен на крайния час".

Уверете се, че няма припокривания във времевите интервали на различните правила на календара. Проверете датите, за да се уверите, че началният час не е по-късен от крайния час . Също така проверете дали часовете следват 24-часовия формат.

Могат ли API да се използват за актуализиране на обекта "Шаблони за работни часове"?

Да, можете да използвате този API за създаване и актуализиране на шаблони за работни часове в допълнение към работното време на ресурса.

Получавам грешката, "Имаше грешка десериализиране на обекта от тип Microsoft.Dynamics.UCICalendar.Plugins.SaveCalendarContract + CalendarEventInfo. Входният източник не е правилно форматиран.
or
Очаквано състояние "Елемент".. Възникна "Текст" с име "", пространство на имената "".

Уверете се, че низът е анализиран правилно. Възможно е да липсват скоби, запетаи или запетая.

Получавам грешката: "Невалиден модел на повторяемост. Обърнете се към документацията за поддържаните модели."

В момента поддържаме само този модел: FREQ=DAILY;INTERVAL=1;BYDAY=SU,MO,TU,WE,TH,FR,SA BYDAY могат да бъдат променени, за да включват по-малко дни; Въпреки това, FREQ и INTERVAL не може да бъде променен. Уверете се, че в шаблона няма интервали.

Как да получим информация за CalendarId и InnerCalendarId на ресурса?

Може да се извлече от атрибутите на CalendarId ресурса. Направете това обаждане, за да получите тази информация: [org-url]/api/data/v9.1/bookableresources([bookableresourceGUID])

Пример за предишния призив би бил [org-url]/api/data/v9.1/bookableresources(7bb0224b-6712-ec11-94f9-000d3a6d888e).

Може да се извлече от атрибутите на InnerCalendarId календара. Направете това обаждане, за да получите тази информация: [org-url]/api/data/v9.1/calendars([calendar-id-from-above-call])?$expand=calendar_calendar_rules

Пример за предишното обаждане е [org-url]/api/data/v9.1/calendars(02481736-1b6a-4d49-9ebd-a5bd041c1c99)?$expand=calendar_calendar_rules.

Какво се случва, ако има припокриващи се правила?

Има няколко различни ранга, под които попадат правилата:

  • Ранг 1 - ежедневно възникване (работно / неработно) и прекъсване на времето.
  • Ранг 0 - седмично повторение (работно/неработно).

V2 припокриващи се правила

  • Правилата за ранг 1 имат по-висок приоритет от правилата за ранг 0. Ако има две правила (по едно от всеки ранг) в един и същи ден, дневната поява или времето за почивка имат приоритет пред седмичното повторение.
  • Когато има няколко правила за ранг 0 в рамките на един и същ период от време:
    • Ако времената не се пресичат, и двете ще останат в календара.
    • Ако времената се пресичат, правилото, което последно е създадено/променено, е това, което се взема предвид за календара на ресурса. Всички други пресичащи се правила в периода от време се премахват. Ако някои правила от ранг 0 имат пресечни точки на някои дати, но не и на други, правилото се снажда, за да запази непресичащите се секции, докато пресичащите се части се премахват.

Примери за поведение на V2 календар:

Пример 1 - Повтарящи се работни часове: Припокриващи се дати без припокриващи се дни/часове

За определен период от време техникът работи сутрин, следобед или нощни смени през различни дни.

  1. Създаване на първо повтарящо се календарно правило за даден диапазон от дати. Например: Повторете Mon, Tue; 1.1-4.1; 8am-5pm ET.

  2. Създайте второ повтарящо се календарно правило за пресичащ се диапазон от дати, като същевременно гарантирате, че работните часове не се пресичат с предишните дни или часове. Например: Повторете Wed, Thu; 1.1-4.1; 8am-5pm ET или Повторете Mon, Tue; 1.1-4.1; 5pm-8pm ET .

Резултат: И двете календарни правила остават и съжителстват едно до друго.

Пример 2 – Повтарящи се работни часове: Някои припокриващи се дати, като всички припокриващи се дни и второ правило започват/завършват преди или след първото правило

Техникът получава нов работен график, който замества няколко седмици от стария им график. По договор те винаги работят в едни и същи дни всяка седмица.

  1. Създаване на първо повтарящо се календарно правило за даден диапазон от дати. Например: Повторете Mon, Tue; 2.1-4.1; 8am-5pm ET.

  2. Създайте второ повтарящо се календарно правило за припокриващ се диапазон от дати, където всички дни имат припокриващи се работни часове. Изберете начална/крайна дата за това ново правило, които са преди или след началната/крайната дата за правилото за юмрук. Например: Повторете Mon, Tue; 3.1-5.1; 1pm-8pm ET.

Резултат: Първото правило се отрязва, за да се приспособи началната / крайната дата на второто правило. Например: Повторете Mon, Tue; 2.1-2.28; 8am-5pm ET И повторете Mon, Tue; 3.1-5.1; 1pm-8pm ET.

Пример 3 - Повтарящи се работни часове: Всички припокриващи се дати, с някои припокриващи се дни/часове

Техникът е работник на договор за определен 2-месечен период. Те се съгласиха да поемат допълнителна работа в някои дни. Те искат да изместят работното време във вторник към по-рано/по-късно време.

  1. Създайте някои повтарящи се календарни правила за даден диапазон от дати. Например: Повторете Mon, Tue; 2.1-4.1; 8am-12pm ET И повторете Tue, Wed; 2.1-4.1, 1pm-5pm ET.

  2. Създайте ново правило за повтарящ се календар за същия диапазон от дати. Изберете дни/часове, които частично се припокриват с първоначалните правила. Например: Повторете Tue, Thurs ; 2.1-4.1; 10am-2pm ET.

Резултат: Новото правило презаписва старото, където има припокривания, и оставя останалите непроменени. Например: Повторете Mon; 2.1-4.1; 8am-12pm ET И повторете Wed; 2.1-4.1; 1pm-5pm ETИповторете Tue, Thurs ; 2.1-4.1; 10am-2pm ET.

Пример 4 – Повтарящи се работни часове: Нови дати на правила, съдържащи се в рамките на старо правило, някои припокриващи се дни/часове

Техникът работи от 8:00 до 17:00 часа, от понеделник до петък всяка седмица. Само за две седмици те ще се справят със специален спешен проект всеки Mon-Wed с различно работно време 6am-6pm.

  1. Създаване на първо повтарящо се календарно правило за даден диапазон от дати. Например: Повторете Mon, Tue, Wed, Thu, Fri; 1.1-No End Date; 8am-5pm ET.

  2. Създайте второ повтарящо се календарно правило, съдържащо се в горния диапазон от дати, изберете работни часове, които се припокриват в някои дни. Например: Повторете Mon, Tue, Wed; 5.1-5.14; 6am-6pm ET.

Резултат: Календарът трябва да има четири повтарящи се правила до края на това упражнение:

  • Отрязване на първото правило до началната дата на второто правило
  • Второто календарно правило
  • създаване на ново правило, подобно на първото правило, но с датите на второто правило за дните без припокриване
  • Отрязване на първото правило, за да започне от крайната дата на второто правило, без крайна дата

Например: Повторете Mon, Tue, Wed, Thu, Fri; 1.1–4.30; 8am-5pm ET И повторете Mon, Tue, Wed; 5.1-5.14; 6am-6pm ET И повторете Thu, Fri, 5.1-5.14; 8am-5pm ET И повторете Mon, Tue, Wed, Thu, Fri; 5.15-No End Date; 8am-5pm ET

Пример 5 - Неповтарящи се работни часове (възникване, правило за ранг 1)

Техникът има няколко дни за сближаване на екипа, които имат предимство пред всички други случаи на работни часове за деня.

  1. Създаване на повтарящо се календарно правило за даден диапазон от дати. Например: Повторете Mon, Tue, Wed, Thu, Fri; 1.1-No End Date; 8am-5pm ET.

  2. Създайте неповтарящо се календарно правило, съдържащо се в горния диапазон от дати. Изберете работни часове, които се припокриват в някои дни. Например: Non-повторение; 6.21; 7am-1pm ET.

Резултат: Календарът трябва да има 1 неповтарящо се правило (събитие) до края на упражнението. Правилото за неповтаряне отменя припокриващото се повтарящо се събитие за целия ден. Например: Повторете Mon, Tue, Wed, Thu, Fri; 1.1-No End Date с изключение на 6.21; non-repeat; 6.21; 7am-1pm ET.

V1 припокриващи се правила

  • Правилата за ранг 1 имат по-висок приоритет от правилата за ранг 0. Така че, ако има две правила (по едно от всеки ранг) в един и същи ден, дневната поява или времето за почивка имат приоритет пред седмичното повторение.
  • Ако има две правила от един и същи ранг, последното създадено/променено правило ще е това, което ще се вземе под внимание за календара на ресурса.
  • Имайте предвид, че целодневните събития са от 1-ви ранг, така че може да помислите да го промените на седмично повторение, за да можете да добавите работни часове за повторение, които да се отчетат.
  • Когато съществува работен час и се създава повторение на почивка, което го припокрива, правилата се разделят по начин, който гарантира спазването на почивката, а останалото време като работно време ще остане такова, каквото е. Например, ако на 21 септември има работно време от 8 до 17 ч. и се добави повторение на почивка на 21 септември от 15 до 19 ч., това ще бъде решено като работно време от 8 до 15 ч. и почивка от 15:00 до 19:00 часа. Ако обаче правилата са създадени в обратен ред (първо е създадена почивка, а след това са създадени работни часове), независимо от времевите интервали, само работният час ще бъде избран отново. Времето за почивка ще се замести.

Кодове на часова зона

Изброена стойност Часова зона
0 (GMT-12:00) Международна линия на смяна на датата – запад
1 (GMT+13:00) Самоа
2 (GMT-10:00) Хавай
3 (GMT-09:00) Аляска
4 (GMT-08:00) Тихоокеанско време (САЩ и Канада)
5 (GMT-08:00) Баха Калифорния
6 (GMT-11:00) Координирано световно време-11
7 (GMT-10:00) Алеутски острови
8 (GMT-09:30) Маркуесас, острови Маркуесас
9 (GMT-09:00) Координирано световно време-09
10 (GMT-07:00) Планинско време (САЩ и Канада)
11 (GMT-08:00) Координирано световно време-08
12 (GMT-07:00) Чихуахуа, Ла Пас, Мазатлан
15 (GMT-07:00) Аризона
20 (GMT-06:00) Централно време (САЩ и Канада)
25 (GMT-06:00) Саскатчеуан
29 (GMT-06:00) Гуадалахара, Мексико Сити, Монтерей
33 (GMT-06:00) Централна Америка
34 (GMT-06:00) Великденски остров
35 (GMT-05:00) Източно време (САЩ и Канада)
40 (GMT-05:00) Индиана (Изток)
43 (GMT-05:00) Хаити
44 (GMT-05:00) Хавана
45 (GMT-05:00) Богота, Лима, Кито, Рио Бранко
47 (GMT-04:00) Каракас
50 (GMT-04:00) Атлантическо време (Канада)
51 (GMT-05:00) Търкс и Кайкос
55 (GMT-04:00) Джорджтаун, Ла Пас, Сан Хуан
56 (GMT-04:00) Сантяго
58 (GMT-04:00) Куяба
59 (GMT-04:00) Асунсион
60 (GMT-03:30) Нюфаундленд
65 (GMT-03:00) Бразилия
69 (GMT-03:00) Буенос Айрес
70 (GMT-03:00) Кайен, Форталеза
71 (GMT-03:00) Салвадор
72 (GMT-03:00) Сен Пиер и Микелон
73 (GMT-03:00) Гренландия
74 (GMT-03:00) Монтевидео
75 (GMT-02:00) Среден Атлантик
76 (GMT-02:00) Координирано световно време-02
77 (GMT-03:00) Арагуайна
80 (GMT-01:00) Азорски о-ви
83 (GMT-01:00) Острови Кабо Верде
84 (GMT+01:00) Казабланка
85 (GMT+00:00) Дъблин, Единбург, Лисабон, Лондон
90 (GMT+00:00) Монровия, Рейкявик
92 (GMT) Координирано световно време
95 (GMT+01:00) Белград, Братислава, Будапеща, Любляна, Прага
100 (GMT+01:00) Сараево, Скопие, Варшава, Загреб
105 (GMT+01:00) Брюксел, Копенхаген, Мадрид, Париж
110 (GMT+01:00) Амстердам, Берлин, Берн, Рим, Стокхолм, Виена
113 (GMT+01:00) Западна Централна Африка
115 (GMT+02:00) Кишинев
120 (GMT+02:00) Кайро
125 (GMT+02:00) Хелзинки, Киев, Рига, София, Талин, Вилнюс
129 (GMT+02:00) Аман
130 (GMT+02:00) Атина, Букурещ
131 (GMT+02:00) Бейрут
133 (GMT+02:00) Дамаск
134 (GMT+03:00) Истанбул
135 (GMT+02:00) Йерусалим
140 (GMT+02:00) Хараре, Претория
141 (GMT+02:00) Уиндхоек
142 (GMT+02:00) Газа, Хеброн
145 (GMT+03:00) Москва, Санкт Петербург
150 (GMT+03:00) Кувейт, Риад
151 (GMT+03:00) Минск
155 (GMT+03:00) Найроби
158 (GMT+03:00) Багдат
159 (GMT+02:00) Калининград
160 (GMT+03:30) Техеран
165 (GMT+04:00) Абу Даби, Мускат
169 (GMT+04:00) Баку
170 (GMT+04:00) Ереван
172 (GMT+04:00) Порт Луи
173 (GMT+04:00) Тбилиси
174 (GMT+04:00) Ижевск, Самара
175 (GMT+04:30) Кабул
176 (GMT+04:00) Астрахан, Уляновск
180 (GMT+05:00) Екатерининбург
184 (GMT+05:00) Исламабад, Карачи
185 (GMT+05:00) Ташкент
190 (GMT+05:30) Ченай, Калкута, Мумбай, Ню Делхи
193 (GMT+05:45) Катманду
195 (GMT+06:00) Астана
196 (GMT+06:00) Дака
197 (GMT+06:00) Омск
200 (GMT+05:30) Шри Джаяварденепура
201 (GMT+07:00) Новосибирск
203 (GMT+06:30) Янгон (Рангун)
205 (GMT+07:00) Банкок, Ханой, Джакарта
207 (GMT+07:00) Красноярск
208 (GMT+07:00) Барнаул, Горно-Алтайск
209 (GMT+07:00) Ховд
210 (GMT+08:00) Пекин, Чунцин, Хонконг, Урумчи
211 (GMT+07:00) Томск
215 (GMT+08:00) Куала Лумпур, Сингапур
220 (GMT+08:00) Тайпе
225 (GMT+08:00) Пърт
227 (GMT+08:00) Иркутск
228 (GMT+08:00) Улан Батор
229 (GMT+09:00) Пхенян
230 (GMT+09:00) Сеул
231 (GMT+08:45) Юкла
235 (GMT+09:00) Осака, Сапоро, Токио
240 (GMT+09:00) Якутск
241 (GMT+09:00) Чита
245 (GMT+09:30) Дарвин
250 (GMT+09:30) Аделаида
255 (GMT+10:00) Канбера, Мелбърн, Сидни
260 (GMT+10:00) Брисбейн
265 (GMT+10:00) Хобарт
270 (GMT+10:00) Владивосток
274 (GMT+10:30) Остров Лорд Хауи
275 (GMT+10:00) о-в Гуам, Порт Морсби
276 (GMT+11:00) Остров Бугенвил
277 (GMT+11:00) Остров Норфолк
278 (GMT+11:00) Сахалин
279 (GMT+11:00) Чокурдах
280 (GMT+11:00) Соломонови о-ви, Нова Каледония
281 (GMT+11:00) Магадан
284 (GMT+12:00) Координирано световно време+12
285 (GMT+12:00) Фиджи
290 (GMT+12:00) Оукланд, Уелингтън
295 (GMT+12:00) Анадир, Петропавловск Камчатски
299 (GMT+12:45) Острови Чатъм
300 (GMT+13:00) Нукуалофа
301 (GMT-05:00) Четумал
302 (UTC+02:00) Хартум
303 (GMT-03: 00) Пунта Аренас
304 (GMT+04:00) Волгоград
305 (GMT-07:00) Юкон