# Бизнес-логика

## Принцип: Hide, Don't Block

Если у пользователя нет доступа к функции, сделке, тренировке, пункту меню — он **не должен видеть этот элемент вообще**. Запрещено показывать элемент и при клике выводить «У вас нет прав».

- Меню/навигация: пункты фильтруются по роли, недоступные не рендерятся
- Данные: API возвращает только доступные записи (WHERE на уровне БД)
- Кнопки/действия: не показываются, если роль не имеет права выполнить действие
- Прямой переход по URL (ссылка от коллеги): допустимо показать «Контент недоступен», но ссылка нигде в UI не появляется

Подробнее: `.claude/docs/roles-rbac.md` → «Принципы UX-авторизации»

## Воронка продаж

```
Новый клиент -> Распределение -> Тренер звонит (SIP)
-> Назначена стартовая тренировка -> Проведена -> Постоянный клиент

Ответвления:
- Перенёс запись -> статус "Перенесён"
- Не дозвониться -> лог в журнале звонков
- Отказ -> модалка с комментарием, закрытие
```

## Конверсия (формулы)

```
Новые->Назначено = Назначено / Новые * 100%
Назначено->Проведено = Проведено / Назначено * 100%
Проведено->Постоянные = Постоянные / Проведено * 100%
```

## Спящие клиенты

Активный абонемент + покупал услуги + > 30 дней без активности.

## Push-уведомления (9 типов)

1. Новый клиент распределён
2. Запись на услугу
3. Оплата услуги
4. Доплата пакета
5. Отмена записи
6. Списание тренировки
7. Окончание тренировок
8. Возврат клиента от администрации
9. День рождения клиента

Deep linking. Админ клуба настраивает типы (вкл/выкл) и текст (1, 2, 5, 7).

## Статусы тренировки

- Запланировано (оранжевый)
- Подтверждено / Оплачено (зелёный)
- Не оплачено / Не прибыл / Отменено (красный)

## Причины отмены

- Отмена клиента, без списания, возврат продажи, заболел
