Учет зимнего времени в поле Бронирование ресурсов Битрикс 24 в рамках API

Одной из привлекательных возможностей Битрикс 24 в качестве CRM-системы для организаций сферы услуг является поле Бронирование ресурсов, в рамках которого можно организовывать обслуживание клиентов в условиях ограничений по персоналу, помещениям и прочим задействованным в оказании услуг ресурсам. При этом, чтобы правильно учитывать зимнее время в бронировании ресурсов необходимо придерживаться определенных правил, о которых пойдет речь в данной статье .

Работе с данным полем посвящена данная статья. Напомним, что данные в поле вводятся в следующую форму.

Зимнее время в бронировании ресурсов

Разумеется, добавлять значения в это поле можно не только вручную, но и посредством API через обычные методы сrm.lead.update, crm.lead.add, crm.deal.update, crm.deal.add.

Для этого в пользовательское поле с префиксом UF_, соответствующее полю бронирования, необходимо передать переменную вида:

#тип_ресурса#|#ID_ресурса#|#дата_время_начала#|#длительность_в_секундах#|#название_услуги#"

При этом дату и время начала следует отформатировать через функцию date.

date("d-m-Y H:i:s", strtotime($yourdate));

При ручном вводе значения или написании интеграции самостоятельно вы столкнетесь со следующим поведением системы Битрикс 24: если дата и время будет позже даты перехода на зимнее время и раньше возврата к летнему в следующем году, то API Битрикс24 механически прибавит 1 час к вашей дате и времени.

Делюсь программным кодом вебхука, чтобы обойти это поведение:

// берете из своей даты день, месяц и год
$day = date("d", strtotime($yourdate));
$month = date("m", strtotime($yourdate));
$year = date("Y", strtotime($yourdate));
// вычисляете текущий год
$cy = date("Y");
// по умолчанию время летнее
$winter = false;
// меняем параметр, если дата приходится на интервал между началом и окончанием зимнего времени
if(($day >= 25 && $month >= 10 && $year==$cy) || ($day <= 29 && $month <= 3 && $year<$cy)) {
$winter = true;
}
$date_deal = $date;
// отнимаем из даты один час, если время зимнее
if($winter) {
$date_new = date_create($date);
date_modify($date_new, "-1 hour"); // на 1 час назад
$date_deal = date_format($date_new, "d-m-Y H:i:s");
}

Итак, данная доработка позволяет правильно учитывать зимнее время при бронировании ресурсов.