0. Краткое описание системы
Система бронирования TropixGo - это модуль внутри супер-приложения для жителей и гостей острова Панган.
Она позволяет пользователям бронировать услуги (массаж, йога, аренда байка, экскурсия и т.п.) в несколько кликов, а исполнителям - управлять своим расписанием и загрузкой.
Система решает три ключевые задачи:
- Для клиентов: показать только реально доступные временные слоты с учётом занятости мастера.
- Для провайдеров: избежать пересечений и двойных броней, управлять перерывами и временем между сеансами.
- Для бизнеса: обеспечить надёжный процесс оплаты и автоматическую обработку броней без ручного вмешательства.
1. Как должна работать система бронирования
Основная идея:
Пользователь выбирает услугу → видит доступные даты и слоты → выбирает время → подтверждает и оплачивает. Система формирует доступные слоты динамически, с учётом всех ограничений.
a. Формирование слотов
Все операции с временем - с учётом таймзоны (timezone).
- Для выбранной услуги (Service) система получает:
- длительность услуги (
duration_min - продолжительность в минутах);
- буфер до и после, которые добавляются к общему времени (
buffer_before / buffer_afterв минутах);
- список мастеров, предоставляющих услугу;
- Рабочие часы мастера - задаются как интервалы (
working_hours), например 09:00–18:00.
- Все существующие брони и перерывы исключаются из доступного времени.
- На основе этих данных система формирует расписание свободных слотов (
available_slots):
- Расчёт начинается от начала рабочего дня мастера с заданным шагом (например, 15 минут - как у Calendly).
- Каждый потенциальный слот проверяется: хватает ли времени до конца рабочего дня с учётом длительности и буфера.
- Если слот не пересекается с уже существующими бронями, он добавляется в список доступных.
- В интерфейсе клиента отображаются только ближайшие актуальные слоты (например, на неделю вперёд - я уточню у фаундера).
- Слот показывается клиенту только если он полностью помещается в свободное окно мастера.
b. Учет длительности и занятости
- Длительность услуги (
duration_min) определяет основное занятое время мастера.
- Буферы (
buffer_before и buffer_after) резервируют дополнительное время перед и после услуги - например, для подготовки, уборки или отдыха.
- Если услуга длится 60 минут, а после неё нужен буфер 15 минут, то слот с 10:00 заблокирует время до 11:15.
- Если в это время уже есть другая бронь, слот не показывается.
- Перерывы мастера (обед, личное время) и существующие брони полностью исключаются из расчёта.