Доля ФОТ в выручке ресторана и доставки
Представляем новый отчёт: "Фонд оплаты труда". Показывает в динамике, какая часть выручки уходит на зарплаты и другие платежи сотрудникам.
С предложением разработать отчёт "Фонд оплаты труда" к нам обратился наш партнёр — Алексей Коняев из новосибирской сети Шеф Ланч 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": []
}Коды нужных нам типов проводок (транзакций):
Готово, теперь у нас есть все исходные данные для построения отчёта.