Расписание, где две брони не встанут рядом
День и неделя: часы по вертикали, залы или дни колонками, линия текущего момента. Пересечение запрещено самой базой — ограничением по диапазону, а не проверкой в форме: второй одновременный запрос такую проверку обходит. Буфер на уборку входит в занятый отрезок, заявка придерживает время, отмена его освобождает.
Публичная страница брони
По своему адресу площадки посторонний без учётной записи выбирает зал, день и час, видит занятое зачёркнутым и оставляет заявку. Цену считает сервер по правилам площадки, занятость отдаётся без имён гостей, на поток стоят потолки. Восемнадцать проверок сделаны от лица постороннего: состав ответа, отказы на пересечение, часы работы, горизонт записи, попытка достать таблицы напрямую.
Цена, зависящая от времени суток
55 + 55 + 90 = 200, если третий час попал в вечерний тариф: сумма собирается по отрезкам, а не умножением на одну ставку. Считается переработка с множителем и округлением блоками, предоплата и залог за ущерб лежат в разных полях, правила отмены заданы ступенями. Согласие гостя с договором сохраняется снимком текста — спор будет о том, с чем человек соглашался тогда.
Захват: фото, документ и голос становятся черновиком
Прислать можно текст, снимок чека, PDF или голосовое. Разбор предлагает черновики пяти видов — бронь, проводка, задача, обращение, клиент — и отдельные строки дополнительных услуг с суммами. Модель ничего не записывает сама: запись создаёт человек нажатием, и ошибка разбора стоит одного «отбросить». Разбор идёт на сервере, поэтому свёрнутое приложение или моргнувшая сеть его не рвут.
Деньги, которые нельзя задвоить
Итоги брони — вычисляемые колонки базы, их нельзя сложить в коде неправильно; оплачено пересчитывается триггером из истории платежей, а не хранится отдельным полем. Доходная проводка не может ссылаться на бронь — иначе одна оплата попала бы в месяц дважды. Список операций за месяц, свод по залам, каналам и статьям, порог безубыточности; границы месяца считаются в поясе площадки, а не по UTC.
Клиентская база, которая не льстит
Срезы: все, постоянные, пропадают, риск, дубли. «Пропал» считается от ритма самого клиента: тот, кто ходит раз в неделю, пропал через три недели тишины, а тот, кто раз в квартал, — нет. Дубли ищутся степенью похожести: совпавший телефон — 100 %, «ё» вместо «е» — 95 %, разные фамилии с общим началом порога не проходят. Без этого выручка одного человека поделена между двумя карточками.
Пять ролей с разграничением в базе
Владелец, управляющий, администратор, бухгалтер, сотрудник. Сотрудник не «не видит» деньги — они до него не доезжают: политики на брони, клиентов и проводки требуют роль, а своё расписание он получает функцией, где денежных колонок физически нет. Личные траты владельца не увидит даже управляющий прямым запросом. Права проверены запросами из-под настоящих токенов, а не чтением политик.
Обращения и время первого ответа
Заявки приходят по ссылке-каналу — форма на сайте, Tilda, Make, Zapier — и через собственного бота площадки в Telegram: бот хозяина, а не общий. Система отмечает момент первого ответа и сверяет его с нормативом площадки. AI-ресепшн умеет предложить свободное время и довести до заявки тем же путём, что публичная страница; каждый машинный ответ помечен как машинный.
Команда, задачи и смены
Приглашение ссылкой, а не письмом: по токену видно только название площадки и роль, ссылка принимается один раз. Задачи сортируются по срочности, исполнитель двигает статус и пишет следующий шаг. Смены — недельная сетка «люди × дни» с закреплённой колонкой имён; ставка копируется в смену снимком, поэтому поднятая ставка не пересчитывает прошлые месяцы.