Розробка модуля бронювання 1С-Бітрікс
Бронювання — це резервування ресурсу на часовий інтервал із запобіганням конфліктів. Ресурс може бути різним: номер у готелі, оренда автомобіля, переговорна кімната, туристичний тур, спортивний об'єкт. Загальна логіка одна — потрібно показати доступність, прийняти резерв і заблокувати слот для інших.
У Бітрікс для цього немає готового інструменту. Завдання іноді намагаються вирішити через замовлення інтернет-магазину, але b_sale_order не призначений для часових інтервалів — немає поняття «період», немає перевірки конфліктів, немає візуалізації зайнятості.
Модель даних
Модуль vendor.booking із ключовими таблицями:
-
b_vendor_booking_resource— ресурси: id, name, type, capacity, iblock_element_id (зв'язок із елементом інфоблоку), settings (JSON: мінімальний термін, максимальний, крок, передоплата) -
b_vendor_booking_slot— заздалегідь визначені слоти (для погодинної оренди): id, resource_id, date, time_from, time_to, status -
b_vendor_booking_reservation— бронювання: id, resource_id, user_id, date_from, date_to, status (pending/confirmed/cancelled/completed), total_price, order_id -
b_vendor_booking_block— ручне блокування дат: id, resource_id, date_from, date_to, reason
Для поденної оренди використовується модель із date_from/date_to без слотів. Для погодинної — слоти з фіксованими інтервалами.
Перевірка доступності
Ключова операція — атомарна перевірка та резервування. Без транзакції перегін даних неминучий при одночасних запитах:
public function reserve(int $resourceId, \DateTime $from, \DateTime $to, int $userId): ReservationResult
{
$connection = \Bitrix\Main\Application::getConnection();
$connection->startTransaction();
try {
// Перевіряємо конфлікти з блокуванням рядків
$conflicts = $connection->query("
SELECT id FROM b_vendor_booking_reservation
WHERE resource_id = {$resourceId}
AND status IN ('pending', 'confirmed')
AND NOT (date_to <= '{$from->format('Y-m-d')}' OR date_from >= '{$to->format('Y-m-d')}')
FOR UPDATE
")->fetch();
if ($conflicts) {
$connection->rollbackTransaction();
return ReservationResult::conflict();
}
$reservationId = ReservationTable::add([
'RESOURCE_ID' => $resourceId,
'USER_ID' => $userId,
'DATE_FROM' => $from,
'DATE_TO' => $to,
'STATUS' => 'pending',
])->getId();
$connection->commitTransaction();
return ReservationResult::success($reservationId);
} catch (\Throwable $e) {
$connection->rollbackTransaction();
throw $e;
}
}
Віджет вибору дат
На фронтенді — інтерактивний календар. Реалізується через flatpickr або кастомний компонент. Зайняті дати отримуються AJAX-запитом:
GET /bitrix/components/vendor/booking.calendar/ajax.php
?resource_id=12&month=2024-06
→ {"available": ["2024-06-01","2024-06-03",...], "booked": ["2024-06-02","2024-06-05",...]}
Дані кешуються через \Bitrix\Main\Data\Cache на 5 хвилин. При зміні бронювання кеш скидається через тег booking_resource_{id}.
Ціноутворення
Вартість розраховується за правилами:
- Базова ставка за період (день/година) із
b_vendor_booking_resource - Сезонні надбавки (високий сезон, свята) із
b_vendor_booking_price_rule - Знижки за тривалу оренду (7+ днів — мінус 10%)
- Мінімальна передоплата у відсотках
$calculator = new PriceCalculator($resource);
$result = $calculator->calculate($dateFrom, $dateTo);
// → ['total' => 15000, 'prepayment' => 3000, 'discount' => 1500, 'nights' => 3]
Оплата та зв'язок із замовленням
Після підтвердження бронювання створюється замовлення в b_sale_order на суму передоплати (або повної вартості). Бронювання пов'язується із замовленням через reservation.order_id. Після успішної оплати статус бронювання змінюється з pending на confirmed.
При скасуванні оплаченого замовлення — статус бронювання cancelled, слот звільняється.
Управління в адміністративному інтерфейсі
Розділ адміністратора включає:
- Список ресурсів із налаштуваннями
- Візуальний розклад (timeline-вид) із бронюваннями по днях
- Форма ручного створення бронювання (для телефонних заявок)
- Блокування дат на технічне обслуговування
- Звіт із завантаженості ресурсів
Timeline-вид будується через JS-бібліотеку (FullCalendar або dhtmlxScheduler), дані — через REST-ендпоінт модуля.
Сповіщення
- Користувачу при створенні бронювання (підтвердження з деталями)
- Користувачу при підтвердженні менеджером
- Адміністратору при новому бронюванні
- Нагадування за N днів до початку (через агент)
Всі сповіщення через стандартний \Bitrix\Main\Mail\Event::send() із шаблонами подій у модулі main.
Терміни розробки
| Етап | Термін |
|---|---|
| Модель даних, ORM-таблиці | 1 день |
| Логіка перевірки доступності (транзакції) | 2 дні |
| Віджет календаря, AJAX доступності | 2 дні |
| Ціноутворення, сезонні правила | 2 дні |
| Зв'язок із замовленнями та оплатою | 2 дні |
| Адміністративний інтерфейс + timeline | 3 дні |
| Сповіщення, нагадування | 1 день |
| Тестування конкурентних резервувань | 1 день |
Разом: 14 робочих днів. Для готелів із номерами різних категорій та управлінням channel manager — окрема оцінка.







