Планирование
Планирование — движок бронирования. Он отвечает на один вопрос: занят ли ресурс в этот интервал. На нём стоят запись клиента к мастеру, аренда оборудования, групповое занятие, бронь стола и заселение.
Календарь — визуальный интерфейс поверх этого движка. Сам движок отвечает за правила и целостность данных.


Ресурс
Ресурс — то, что бронируется:
| Тип | Что это | Пример |
|---|---|---|
| Сотрудник | Человек | Мастер, врач, тренер |
| Место | Посадочное место | Кресло, столик, кабинет |
| Юнит | Обособленная единица | Номер, коворкинг-место |
| Оборудование | Техника и инвентарь | Инструмент, велосипед, аппарат |


У ресурса настраиваются:
- Вместимость — 1 для индивидуальной работы, N для группового занятия;
- Рабочие окна — по дням недели: когда ресурс вообще доступен;
- Буфер — минуты между бронями на уборку и подготовку;
- Минимальная длительность брони;
- Навыки и услуги — что этот ресурс умеет. Пустой список означает «универсален»; как только появилась хоть одна услуга, записать можно только на неё.
Бронь
Бронь — интервал на ресурсе со статусом: создана, подтверждена, состоялась, клиент не пришёл, отменена.
Источник фиксируется отдельно: завёл сотрудник, клиент записался сам по публичной ссылке или бронь пришла из интеграции — так видно, откуда идёт поток.
Бронь может ссылаться на клиента, услугу каталога, сделку и объект обслуживания, но ничего из этого не обязательно: минимальная бронь — ресурс и интервал.
Мультиресурсные брони. Одна запись занимает несколько ресурсов сразу — мастера и кресло, тренера и зал. Занятость проверяется по всем.
Групповые занятия. Если вместимость больше единицы, к брони добавляются участники со статусами: записан, пришёл, не пришёл, отменил.
Повторы
Регулярные записи описываются правилом: занятие каждый вторник, ТО раз в квартал. Брони генерируются на горизонт вперёд, серия ограничивается датой окончания. Изменение одной брони серии не ломает остальные.
Тарифы
Цена брони считается по тарифам: за час, за сутки или фиксированная. Тариф привязывается к ресурсу, к услуге или к их паре, сезонный — ограничивается датами.
Когда подходит несколько тарифов, выбирается самый специфичный из действующих, а при равенстве — с наибольшим приоритетом. Это позволяет держать базовый прайс и накрывать его сезонными исключениями, ничего не переписывая.
Абонементы
Пакет визитов или часов продаётся заранее и списывается по мере посещений. У абонемента есть срок действия и правила заморозки. Остаток виден и клиенту, и администратору — спор «сколько у меня осталось» решается за секунду.
Предоплата и неявки
У брони есть депозит со своим состоянием: не требуется, требуется, получен, возвращён, удержан. Удержанный депозит уходит в прочие доходы отдельной операцией, а не растворяется в «потерянных» деньгах.
Прокат


Для аренды бронь дополняется выдачей и возвратом. Обе операции атомарны: два сотрудника не выдадут один экземпляр дважды. При возврате депозит возвращается или удерживается, а сама аренда может превратиться в продажу.
Лист ожидания
Если свободных слотов нет, клиент встаёт в лист ожидания на ресурс и интервал. Когда слот освобождается, видно, кому его предложить — и звонок делается по факту, а не по памяти.
Уборка
Для юнитов ведётся состояние: готов, требует уборки, в работе. Задачи создаются автоматически после освобождения и не дают заселить неподготовленный номер.
Связь с другими компонентами
- Календарь — визуальное расписание и перетаскивание.
- Каталог — услуга задаёт длительность и цену.
- Клиенты — история записей и напоминания.
- Касса и продажи — оплата брони чеком.
- Сделки — выезд мастера как бронь на исполнителе.