Разработка платформы для бронирования отелей
Платформа бронирования отелей — сложная система с управлением номерным фондом, тарифами, динамическим ценообразованием, интеграцией с PMS-системами отелей и GDS-дистрибуцией. Разработка с нуля до уровня Booking.com — многолетний проект, но региональный агрегатор или B2B-инструмент для сети отелей — реалистичная задача.
Модель данных: номерной фонд
Hotel
└── RoomType (Стандарт, Делюкс, Сьют)
├── Атрибуты (площадь, вид, вместимость, удобства)
└── Inventory (количество номеров данного типа)
└── Rate Plans (Невозвратный, Гибкий, Завтрак включён)
└── Availability × Date × Price
Управление доступностью: для каждого типа номера и каждой даты хранится quota (доступное количество) и price. При бронировании quota уменьшается на 1.
CREATE TABLE room_availability (
room_type_id, date DATE, rate_plan_id,
available_count INT NOT NULL DEFAULT 0,
price_per_night DECIMAL(10,2),
PRIMARY KEY (room_type_id, date, rate_plan_id)
);
-- Атомарное бронирование с проверкой остатка
UPDATE room_availability
SET available_count = available_count - 1
WHERE room_type_id = $1 AND date = ANY($dates)
AND rate_plan_id = $2 AND available_count > 0;
Мульти-ночное бронирование
Бронирование охватывает несколько ночей. Цена суммируется по ночам (в разные даты могут быть разные тарифы). Нужно обновить availability для каждой даты чекина.
Динамическое ценообразование
Revenue Management System (RMS) автоматически корректирует тарифы на основе:
- Заполняемости (occupancy): если номера быстро заканчиваются — цену вверх
- Опережающего спроса: много поисков на определённую дату → цену вверх
- Сезонности и событий (конференции, праздники)
- Цен конкурентов (rate parity monitoring)
Простая реализация: cron-задача раз в час пересчитывает тарифы по правилам.
Поиск с фильтрами
Поиск «отели в Сочи, 2–5 августа, 2 гостя, 1 номер»:
SELECT h.*, rt.*, ra.price_per_night
FROM hotels h
JOIN room_types rt ON rt.hotel_id = h.id
JOIN room_availability ra ON ra.room_type_id = rt.id
WHERE h.city = 'Сочи'
AND ra.date BETWEEN '2024-08-02' AND '2024-08-04'
AND rt.max_occupancy >= 2
GROUP BY h.id, rt.id
HAVING MIN(ra.available_count) > 0 -- все ночи доступны
ORDER BY SUM(ra.price_per_night) ASC;
Интеграция с Channel Manager / PMS
Отели используют PMS (Property Management System: Opera, Fidelio, SHELTER) для управления номерным фондом. Обновления доступности и цен должны синхронизироваться:
OTA-интеграция: стандарт OTA XML (Open Travel Alliance) для двусторонней синхронизации с GDS и OTA-каналами.
Channel Manager: промежуточный слой (SiteMinex, Effortless, MyAllocator) агрегирует данные отеля и распределяет по каналам через единый API.
Прямой PMS API: для крупных отелей — прямая интеграция через REST или SOAP API конкретной PMS.
Политика отмены
Тарифные планы имеют разные политики:
- Невозвратный (Non-refundable): скидка 10–20%, отмена без возврата
- Гибкий (Flexible): отмена за 24–48 часов — полный возврат
- Частичный возврат: % зависит от времени до заезда
Оплата и гарантии
Два режима оплаты:
- Pay now: оплата при бронировании (через Stripe/ЮКасса)
- Pay at hotel: гарантия картой (авторизация без списания), оплата на стойке
Для «Pay at hotel» — Stripe PaymentIntent с capture_method: manual. Авторизуем карту при бронировании, capture — при чекине.
Карты и геопоиск
Отображение отелей на карте — Mapbox GL JS или Leaflet с кластеризацией. PostGIS для геопоиска («отели в 2 км от пляжа» или «внутри выбранной области на карте»).
Сроки
MVP (каталог отелей, поиск по датам, бронирование, оплата, ЛК): 4–5 месяцев. С Channel Manager, динамическими тарифами, мобильным приложением, PMS-интеграцией: 8–14 месяцев.







