iiko
December 15, 2023

Доля ФОТ в выручке ресторана и доставки

Представляем новый отчёт: "Фонд оплаты труда". Показывает в динамике, какая часть выручки уходит на зарплаты и другие платежи сотрудникам.

Новый отчёт на платформе Fudov Smart – "Фонд оплаты труда"

С предложением разработать отчёт "Фонд оплаты труда" к нам обратился наш партнёр — Алексей Коняев из новосибирской сети Шеф Ланч chef-lunch.ru. Поскольку идея на миллион (мы уверены, что отчёт будет полезен многим пользователям платформы Fudov Smart), разработка за наш счёт.

Как работает отчёт

Идея простая — объединить должности сотрудников в группы "Повара", "Менеджеры", "Курьеры", а затем для этих групп отслеживать изменение доли ФОТ (фонда оплаты труда) в выручке предприятия.

Пример объединения:

  1. Группа "Повара" включает должности: "Повар", "Наставник", "Старший повар", "Шеф".
  2. Группа "Менеджеры" включает должности: "Администратор", "Старший администратор".
  3. Группа "Курьеры" включает должности: "Курьер", "Пеший курьер", "Велокурьер".

Доля ФОТ в выручке для каждой группы считается по формуле: ФОТ ÷ выручка компании × 100%.

Доля ФОТ в выручке — это показатель, который обычно анализируют в динамике. Типовые сценарии:

  1. Выручка растёт, а доля ФОТ в выручке снижается. Это идеальный вариант. Значит, каждый сотрудник в команде работает максимально эффективно.
  2. Выручка растёт, доля ФОТ не меняется — нормальная ситуация, хотя не идеальная. Означает, что команда работает достаточно эффективно, но есть куда расти.
  3. Доля ФОТ растёт. Такая ситуация говорит о том, что бизнес нанял лишних или неэффективных людей.

Рост доли ФОТ в выручке может быть оправдан в первые месяцы после найма новых людей, но затем доля ФОТ должна снижаться. Если этого не происходит, нужно проводить глубокий анализ:

  • проверять, не "раздут" ли штат;
  • оценивать эффективность работы сотрудников;
  • анализировать орг. структуру — нет ли дублирующихся функций и лишних людей.

По-хорошему, каждый нанятый сотрудник должен обеспечивать прирост выручки.

Отчёт уже подключен к демо-кабинету и доступен для всех пользователей платформы Fudov Smart по подписке.

Мы с 2018 года занимаемся разработкой интеграций iiko и подобных отчётов. А ещё у нас своё курьерское приложение и telegram боты, которые беспощадно истребляют рутину и поднимают автоматизацию ресторана и доставки на новый уровень. Если заинтересовались — пишите на почту hello@fudov.ru.

Технические детали

Алгоритм построения отчёта "Фонд оплаты труда":

  1. Выгрузить должности -> /resto/api/employees/roles.
  2. Выгрузить сотрудников -> /resto/api/employees. Чтобы составить справочник идентификаторов сотрудников и ФИО.
  3. Объединить выбранные должности в группы: "Повара", "Менеджеры", "Курьеры".
  4. Выгрузить явки сотрудников за выбранные дни -> /resto/api/employees/attendance. Явки связаны с сотрудниками, должностями, расписанием смен соответствующими внешними ключами.
  5. Выгрузить OLAP отчёт для получения выручки всех подразделений за выбранные дни. С единственным агрегированным столбцом fullSum.
  6. Выгрузить смены расписания -> /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": []
}

Коды нужных нам типов проводок (транзакций):

  • BONUS — "Премия"
  • TARIFF_HOUR — "Почасовая оплата"
  • INCENTIVE_PAYMENT — "Мотивация"

Готово, теперь у нас есть все исходные данные для построения отчёта.