Своя форма бронирования Битрикс24: функция временных слотов

Добавление в кастомную веб-форму Битрикс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);

    
Связаться с нами

Свяжитесь с нами удобным для вас способом

Наши контакты
Написать нам