01
Сначала определите управленческий вопрос
Сеть фитнес-клубов обычно получает несколько разных ответов на вопрос о выручке филиала. Касса показывает место оплаты. CRM хранит клуб продажи и менеджера. СКУД показывает, где клиент реально тренировался. Договор может относиться к юридическому лицу, а услугу оказывают сразу несколько площадок. Каждый источник правдив в своей задаче.
Перед настройкой формулы зафиксируйте цель. Для расчёта комиссии отдела продаж важен филиал продажи. Для оценки запуска нового клуба полезна первая активация. Для анализа загрузки, эксплуатационных затрат и вклада команды важны подтверждённые посещения. Управленческое распределение объединяет эти взгляды в одной версии правила.
Запишите владельца методики, список услуг, период применения и решения, которые будут приниматься по отчёту. Отдельно укажите, какие данные остаются бухгалтерским фактом. Распределение помогает управлять сетью и не меняет первичные документы, кассовую операцию или договор с клиентом.
Согласуйте терминологию до разработки. Филиал продажи, филиал первой активации и филиал использования должны иметь одно определение для финансов, продаж и операционной команды. Понятный словарь снижает количество ручных исправлений и споров при закрытии месяца.
- какое решение принимает руководство по отчёту;
- какие услуги входят в распределение;
- какие факты считаются исходными;
- кто утверждает формулу и её изменения;
- с какой даты действует каждая версия.
02
Соберите три независимых основания
Первое основание представляет продажу. Источником служит подтверждённая финансовая операция с филиалом, организацией, услугой, клиентом, суммой, валютой и датой. Возврат или корректировка проходит отдельной операцией и сохраняет связь с первоначальной продажей. Черновой счёт и незавершённый платёж в расчёт не входят.
Второе основание представляет первую активацию. Зафиксируйте событие, после которого членство считается начатым: первый проход, подтверждённая тренировка, ручная активация администратором или дата по договору. Для каждого типа членства должно действовать одно правило приоритета. Повторная синхронизация не создаёт новую первую активацию.
Третье основание представляет использование. Берите подтверждённые посещения за расчётный период. Событие содержит филиал, зону или занятие, время и статус. Отменённая запись, отклонённый проход и технический дубль исключаются. Если клуб допускает ручную отметку, она получает автора, причину и аудит.
Храните основания раздельно. Попытка восстановить активацию из поля продажи или угадать посещение по домашнему клубу делает отчёт красивее и слабее. Отсутствующий факт должен оставаться видимым пробелом. Команда исправляет источник, а расчёт затем воспроизводится на полной истории.
03
Настройте формулу 40/20/40
Базовая версия может отдавать 40% филиалу продажи, 20% филиалу первой активации и 40% филиалам использования. Это стартовая управленческая гипотеза. Сеть утверждает собственные веса с учётом модели продаж, роли домашнего клуба и структуры затрат. Веса хранятся в базисных пунктах, где 10 000 означает 100%.
Пример: абонемент стоит 3 000 000 UZS. Продажу оформил филиал А, первая активация прошла в филиале Б. За период клиент совершил восемь подтверждённых визитов: два в Б и шесть в В. Доля продажи составляет 1 200 000, доля активации 600 000, доля использования 1 200 000 UZS.
Посещенческая доля распределяется пропорционально визитам. Филиал Б получает 300 000 UZS за два визита, филиал В получает 900 000 за шесть. Общий результат: А получает 1 200 000, Б получает 900 000 с учётом активации, В получает 900 000 UZS. Итог равен исходным 3 000 000.
Проверьте формулу на крайних случаях. Продажа и активация могут относиться к одному филиалу. Все посещения могут пройти там же. У абонемента может отсутствовать активация, а у новой продажи пока нет визитов. Каждый сценарий получает заранее согласованное поведение и видимый остаток.
- продажа: 4 000 базисных пунктов;
- первая активация: 2 000 базисных пунктов;
- использование: 4 000 базисных пунктов;
- общая сумма: ровно 10 000 базисных пунктов.
04
Зафиксируйте правила периода и использования
Определите, какая выручка распределяется в выбранном месяце. Для кассового взгляда подходит дата оплаты. Для признания услуги может потребоваться график по сроку членства. Эти методы отвечают на разные вопросы. В первой версии выберите один метод и укажите его прямо в названии отчёта и словаре метрик.
Если доля использования опирается на визиты периода, годовой абонемент будет участвовать в нескольких месяцах только при соответствующем признании выручки. При кассовом распределении вся сумма покупки относится к одному периоду, а посещения для её распределения нужно брать из заранее определённого окна. Смешение методов создаёт нестабильный итог.
Установите часовой пояс организации и границы дня. Поздний проход около полуночи должен попадать в один и тот же период в СКУД, отчёте и экспорте. События с будущей датой, слишком поздняя загрузка и исправления закрытого периода получают отдельные правила обработки.
Для первого пилота удобно взять закрытый календарный месяц и операции с полностью завершённым окном использования. Руководитель быстрее сверит сумму и поймёт механику. После приёмки можно добавить другие модели признания через отдельные версии отчёта, сохранив прежние результаты.
05
Считайте деньги детерминированно
Денежные значения храните в минимальной единице валюты целым числом. Умножайте сумму на вес в базисных пунктах и делите на 10 000. Промежуточные дроби требуют единого правила округления. Расчёт через обычные числа с плавающей точкой приводит к расхождениям между API, экспортом и таблицей.
После округления может остаться одна или несколько минимальных единиц. Назначайте их детерминированно: например, по наибольшей дробной части, затем по стабильному идентификатору филиала. Повторный запуск с теми же фактами и политикой возвращает идентичные строки и суммы.
Для посещений сначала определите долю основания, затем распределите её между филиалами по количеству или утверждённому весу визитов. Сумма внутренних частей должна равняться доле использования. После этого проверьте общий инвариант: распределено плюс остаток равно исходной сумме операции.
Добавьте автоматические тесты на одну копейку или тийин, несколько филиалов с равными остатками, очень маленькую сумму, возврат и повторный расчёт. В production полезен контрольный счётчик расхождений. Его нормальное значение равно нулю, любое отклонение блокирует финансовое закрытие отчёта.
- целые значения минимальной денежной единицы;
- единое правило округления;
- стабильное распределение остатка;
- точное равенство итогов;
- идемпотентный повторный расчёт.
06
Показывайте coverage и остаток
Coverage отвечает на вопрос, какая доля операций имеет достаточное основание. Считайте его отдельно для продажи, первой активации и посещений. Один общий процент скрывает причину проблемы. Рядом показывайте количество операций, сумму и долю выручки, которую удалось распределить по каждому основанию.
Если первая активация отсутствует, соответствующие 20% остаются в остатке. Если нет подтверждённых визитов, доля использования тоже остаётся нераспределённой. Такой fail-closed подход сохраняет честность отчёта. Подстановка домашнего клуба превращает проблему качества данных в ложную эффективность филиала.
Разделите причины остатка: новая продажа без начала услуги, ошибка импорта, неизвестный филиал, задержка СКУД, отменённая операция или недостаточное право доступа к источнику. У каждой категории есть владелец и срок. Финансы исправляют операцию, администрация проверяет активацию, техническая команда восстанавливает поток посещений.
Установите пороги для закрытия месяца. Например, филиал продажи должен иметь 100% покрытия, первая активация оценивается только для начавшихся членств, а посещения требуют согласованного минимального уровня. Порог зависит от процесса клуба и фиксируется рядом с версией политики.
07
Версионируйте политику и защищайте роли
Политика проходит состояния черновик, опубликована и архив. Черновик позволяет финансовой команде проверить результат на историческом периоде. Публикация фиксирует веса, дату начала действия и автора. Архив завершает использование версии для новых периодов, сохраняя связь с уже рассчитанной историей.
Пересечение двух опубликованных версий на одну дату блокируется. Изменение весов создаёт следующую запись. Отчёт хранит ссылку на применённую версию, поэтому через несколько месяцев можно объяснить любой итог. Ручная правка старого JSON или строки базы исключается из рабочего процесса.
Разделите разрешения. Право чтения отчёта требуется руководителю сети и утверждённым финансовым ролям. Право управления политикой получают ограниченные владельцы методики. Администратор ресепшена, тренер и клиент не видят финансовый маршрут. Экспорт следует тем же правилам, что экран.
В multi-tenant платформе каждая таблица и запрос несут organization scope. Row level security и API проверяют tenant независимо. Аудит фиксирует создание, публикацию, архивирование и запуск расчёта. Такой контракт позволяет расширять Taska Core для ProGym и сохранять стабильность других продуктов на том же ядре.
- одна действующая версия на дату;
- неизменяемая опубликованная история;
- раздельные разрешения на чтение и управление;
- изоляция организации в базе и API;
- аудит каждого финансового действия.
08
Проведите приёмку на маршрутах реальных клиентов
Подготовьте минимум десять операций. Включите продажу и использование в одном клубе, центральный отдел продаж, первую активацию в другом филиале, визиты по двум и трём площадкам, членство без активации, новую продажу без визитов, возврат, ручную отметку и технический дубль события.
Для каждой операции заранее рассчитайте ожидаемые суммы. Сверьте источник, веса, округление, остаток и итог филиала. Затем повторите расчёт. Строки и суммы должны совпасть. Измените черновик политики и убедитесь, что опубликованная история осталась прежней до явного применения новой версии.
Проверьте отрицательные сценарии. Вес 9 999 или 10 001 базисный пункт не публикуется. Сотрудник без разрешения не меняет правило. Запрос с идентификатором другой организации не возвращает данные. Маршрут без сессии закрыт. Отсутствующее посещение создаёт остаток с понятной причиной.
Завершите проверкой интерфейса. Руководитель должен за минуту назвать исходную, распределённую и нераспределённую сумму, лидирующий филиал и проблему покрытия. На телефоне шириной 390 пикселей таблица и карточки сохраняют смысл, элементы управления имеют высоту от 44 пикселей, горизонтальная прокрутка страницы отсутствует.
09
Встройте отчёт в закрытие месяца
До закрытия финансовый ответственный сверяет подтверждённые продажи и корректировки. Операционная команда завершает активации и проверяет посещения. Система пересчитывает распределение по опубликованной версии и показывает coverage. Остатки получают причину, владельца и срок исправления.
После достижения порогов руководитель фиксирует версию отчёта. Сумма по филиалам используется в управленческом P&L, план-факте и сравнении сети. Комиссии сотрудников получают собственный утверждённый контур, если их формула отличается. Одна цифра не должна молча обслуживать несколько разных правил мотивации.
На ежемесячной встрече смотрите три слоя: способность филиала продавать, способность запускать клиента и реальное оказание услуги. Сильные продажи при низком использовании требуют проверки ожиданий и маршрута клиента. Высокое использование при слабых продажах показывает вклад клуба в удержание всей сети.
Начать можно с рабочего контура ProGym. На странице распределения выручки доступны исходная сумма, результат по филиалам, coverage, политика 40/20/40 и история версий. Для пилота выберите закрытый месяц, согласуйте словарь и пройдите сценарии из этого руководства вместе с финансовым владельцем сети.
- сверить продажи и корректировки;
- закрыть активации и поток посещений;
- устранить критичные пробелы coverage;
- зафиксировать версию политики и отчёта;
- связать итог с P&L и план-фактом;
- сохранить протокол расхождений и решений.