Добавление в кастомную веб-форму Битрикс24 функционала бронирования CRM Сделок.
Исходное состояние – календарь. При выборе даты, в котором, инициируется событие - получение свободных временных слотов.
Одним из параметров является дата бронирования $_REQUEST["dateReserve"].
Для начала определим стартовое время, с которого будет начинаться временные интервалы. Если выбран сегодняшний день, то округлим время начала кратно 10 минутам. В противном случае, время начала возьмем «8:00».
function roundToNearestTenMinutes()
{
// Получаем текущее время
$now = new DateTime();
// Получаем минуты текущего времени
$minutes = (int)$now->format('i');
// Округляем минуты до ближайших 10
$minutes = $minutes + (10 - ($minutes % 10));
$minutes = $minutes + 60;
// Устанавливаем округленные минуты в объект DateTime
$now->setTime($now->format('H'), $minutes);
return $now;
}
$date = new DateTime($dateReserve);
$dateForm = $date->format('Y-m-d');
$date = new DateTime();
$dateCur = $date->format('Y-m-d');
if($dateForm == $dateCur) {
$roundedTime = roundToNearestTenMinutes();
$timeInput = $roundedTime->format('H:i');
} else {
$timeInput = "08:00";
}
Далее получим массив уже забронированных событий CRM.
$CCalendarList = (CRest::call(
'calendar.event.get',
[
"type" => 'user',
"ownerId" => '1',
"from" => $dateForm,
"to" => $dateForm
])
);
$resReserve = $CCalendarList["result"];
$resReserveTime = [];
if ($resReserve) {
foreach ($resReserve as $value) {
$date = new DateTime($value["DATE_FROM"]);
$DATE_FROM = $date->format('H:i');
$date = new DateTime($value["DATE_TO"]);
$DATE_TO = $date->format('H:i');
$resReserveTime[] = ["DATE_FROM" => $DATE_FROM, "DATE_TO" => $DATE_TO];
}
}
Функция формирования временных слотов создаст нам массив значений (каждые 10 минут). Временем начала которой будет – ранее определенное значение, а временем окончания будет «17:00».
$timeSlots = [];
function getTimeSlots($time)
{
// Преобразуем входное время в объект DateTime
$startDateTime = DateTime::createFromFormat('H:i', $time);
// Проверяем, что время корректно
if ($startDateTime === false) {
return ['error' => 'Некорректный формат времени. Используйте формат HH:MM.'];
}
$endDateTime = clone $startDateTime; // Устанавливаем конечное время на 18:00
$endDateTime->setTime(17, 0);
// Инициализируем массив для хранения временных меток
$timeSlots = [];
while ($startDateTime <= $endDateTime) {// Проверяем, если начальное время меньше конечного
$timeSlots[] = $startDateTime->format('H:i');// Добавляем текущее время в массив
$startDateTime->modify('+10 minutes');
}
return $timeSlots;
}
$timeSlots = getTimeSlots($timeInput);
Теперь остается вычесть из полученного массива, значения уже зарезервированных событий:
function getAvailableSlots($possibleSlots, $reservedSlots)
{
foreach ($reservedSlots as $reservedSlot) {
$from = $reservedSlot['DATE_FROM'];
$to = $reservedSlot['DATE_TO'];
// Удаляем зарезервированные слоты из массива возможных слотов
$possibleSlots = array_filter($possibleSlots, function ($slot) use ($from, $to) {
return $slot < $from || $slot >= $to;
});
}
return $possibleSlots;
}
$result = getAvailableSlots($timeSlots, $resReserveTime);