Доля ФОТ в выручке ресторана и доставки
Представляем новый отчёт: "Фонд оплаты труда". Показывает в динамике, какая часть выручки уходит на зарплаты и другие платежи сотрудникам.
С предложением разработать отчёт "Фонд оплаты труда" к нам обратился наш партнёр — Алексей Коняев из новосибирской сети Шеф Ланч chef-lunch.ru. Поскольку идея на миллион (мы уверены, что отчёт будет полезен многим пользователям платформы Fudov Smart), разработка за наш счёт.
Как работает отчёт
Идея простая — объединить должности сотрудников в группы "Повара", "Менеджеры", "Курьеры", а затем для этих групп отслеживать изменение доли ФОТ (фонда оплаты труда) в выручке предприятия.
- Группа "Повара" включает должности: "Повар", "Наставник", "Старший повар", "Шеф".
- Группа "Менеджеры" включает должности: "Администратор", "Старший администратор".
- Группа "Курьеры" включает должности: "Курьер", "Пеший курьер", "Велокурьер".
Доля ФОТ в выручке для каждой группы считается по формуле: ФОТ ÷ выручка компании × 100%.
Доля ФОТ в выручке — это показатель, который обычно анализируют в динамике. Типовые сценарии:
- Выручка растёт, а доля ФОТ в выручке снижается. Это идеальный вариант. Значит, каждый сотрудник в команде работает максимально эффективно.
- Выручка растёт, доля ФОТ не меняется — нормальная ситуация, хотя не идеальная. Означает, что команда работает достаточно эффективно, но есть куда расти.
- Доля ФОТ растёт. Такая ситуация говорит о том, что бизнес нанял лишних или неэффективных людей.
Рост доли ФОТ в выручке может быть оправдан в первые месяцы после найма новых людей, но затем доля ФОТ должна снижаться. Если этого не происходит, нужно проводить глубокий анализ:
- проверять, не "раздут" ли штат;
- оценивать эффективность работы сотрудников;
- анализировать орг. структуру — нет ли дублирующихся функций и лишних людей.
По-хорошему, каждый нанятый сотрудник должен обеспечивать прирост выручки.
Отчёт уже подключен к демо-кабинету и доступен для всех пользователей платформы Fudov Smart по подписке.
Мы с 2018 года занимаемся разработкой интеграций iiko и подобных отчётов. А ещё у нас своё курьерское приложение и telegram боты, которые беспощадно истребляют рутину и поднимают автоматизацию ресторана и доставки на новый уровень. Если заинтересовались — пишите на почту hello@fudov.ru.
Технические детали
Алгоритм построения отчёта "Фонд оплаты труда":
- Выгрузить должности -> /resto/api/employees/roles.
- Выгрузить сотрудников -> /resto/api/employees. Чтобы составить справочник идентификаторов сотрудников и ФИО.
- Объединить выбранные должности в группы: "Повара", "Менеджеры", "Курьеры".
- Выгрузить явки сотрудников за выбранные дни -> /resto/api/employees/attendance. Явки связаны с сотрудниками, должностями, расписанием смен соответствующими внешними ключами.
- Выгрузить OLAP отчёт для получения выручки всех подразделений за выбранные дни. С единственным агрегированным столбцом
fullSum
. - Выгрузить смены расписания -> /resto/api/employees/schedule. Для каждой смены сотрудника в этом отчёте будет доступно поле
paymentDetails
.
Казалось бы, этого достаточно для получения ФОТ и расчёта доли ФОТ в выручке. Но нет, есть одна проблема.
Внимательно смотрим на заполнение поля paymentDetails
:
<paymentDetails> <regularPayedMinutes>300</regularPayedMinutes> <regularPaymentSum>50.000000000</regularPaymentSum> <overtimePayedMinutes>0</overtimePayedMinutes> <overtimePayedSum>0</overtimePayedSum> <otherPaymentsSum>0</otherPaymentsSum> </paymentDetails>
Это данные о начислениях заработной платы, связанных с данной сменой. Данные заполняются только для смен по должностям со сменным графиком и окладом. Но почему не учтены премии, мотивационные бонусы и другие выплаты сотрудникам?
В документации Айко находим только такой комментарий: "У явок в текущей реализации все попадает в regular, но это может измениться в следующих версиях."
Значит, нужно найти способ выгрузки всех дополнительных выплат сотрудникам. Пишем запрос в поддержку iiko API, как нам найти эти выплаты? Получаем ответ: в OLAP отчете по проводкам "reportType": "TRANSACTIONS"
.
Еще внимательнее изучаем документацию OLAP отчета по проводкам, экспериментируем и находим решение. Достаточно выполнить запрос с такими параметрами:
{ "reportType": "TRANSACTIONS", "buildSummary": "false", "groupByRowFields": [ "DateTime.Typed", "DateTime.DateTyped", "Counteragent.Name", "Counteragent.Id", "Account.CounteragentType", "TransactionType", "Department.Code" ], "groupByColFields": [ ], "aggregateFields": [ "Sum.Incoming" ], ... }
Фильтр по полю DateTime.DateTyped
нельзя задавать с совпадающими границами. Выход простой — правой границей задать следующий день, при этом выставить флаг "includeHigh": "false"
.
{ "data": [ { "Account.CounteragentType": "EMPLOYEE", "Counteragent.Id": "96f13bc8-4669-437b-96c8-2abb05faf896", "Counteragent.Name": "Иванов Иван", "DateTime.DateTyped": "2023-10-15", "DateTime.Typed": "2023-10-15T00:00:00", "Department": "ЛН", "Sum.Incoming": 920, "TransactionType": "TARIFF_HOUR" }, { "Account.CounteragentType": "EMPLOYEE", "Counteragent.Id": "96f13bc8-4669-437b-96c8-2abb05faf896", "Counteragent.Name": "Иванов Иван", "DateTime.DateTyped": "2023-10-15", "DateTime.Typed": "2023-10-15T00:00:00", "Department": "ЛН", "Sum.Incoming": 3300, "TransactionType": "INCENTIVE_PAYMENT" }, { "Account.CounteragentType": "EMPLOYEE", "Counteragent.Id": "96f13bc8-4669-437b-96c8-2abb05faf896", "Counteragent.Name": "Иванов Иван", "DateTime.DateTyped": "2023-10-15", "DateTime.Typed": "2023-10-15T06:00:00", "Department": "ЛН", "Sum.Incoming": 700, "TransactionType": "BONUS" } ], "summary": [] }
Коды нужных нам типов проводок (транзакций):
Готово, теперь у нас есть все исходные данные для построения отчёта.