Внутренняя ERP для управления командой
Внутренний продукт ИТ-компании
Закрыть месяц
было 18–37 часов
1–2 часа
Два-четыре полных рабочих дня в месяц возвращаются HR и бухгалтерии — к работе, которую за них никто не сделает
Оформить отпуск
было переписка и напоминания
30 секунд
Сотрудник отвечает боту в Telegram, руководитель нажимает одну кнопку. Ни входа в систему, ни обучения — ни одному из тридцати
Внести данные
было четыре места ввода
Один раз
Дальше заявка сама доходит до календаря команды, остатка отпускных дней и зарплатного листа. Расхождениям неоткуда взяться
Найти спорную строку
было после выплаты
До выплаты
Спорные суммы видны в черновике, и любую можно раскрыть до формулы с подставленными числами — пока деньги ещё не ушли
Оговорка о данных
Система внутренняя, доступ к её боевым данным закрыт: реальные данные не раскрываются. На кадрах и в примерах кейса — демонстрационный датасет компании такого же размера: 30+ сотрудников, 6 команд. Суммы, имена, состав команд и остатки отпускных дней на кадрах показательные, а механика от этого не меняется: демонстрационные данные проходят через те же правила расчёта, что и боевые. Датасет детерминирован — повторная загрузка даёт те же числа. Интерфейс на кадрах английский.
Контекст
Задача
Нужна была система, где заявка вводится один раз — а календарь, баланс отпускных дней и сумма в ведомости пересчитываются сами и остаются в истории. Компания на 30+ человек перестала помещаться в переписку и таблицы: процессы существовали, но нигде не были записаны, правила жили в голове у HR, данные лежали в пяти несвязанных местах.
- Заявки на отпуск и отгул приходили в личные сообщения. Через неделю ни руководитель, ни сотрудник уже не могли восстановить, о чём договорились.
- Остаток отпускных дней считали вручную. При увольнении это регулярно превращалось в спор.
- Часы из трекеров переносили в таблицу копированием — день-два работы в месяц и ошибки переноса.
- Зарплатная ведомость собиралась в таблице: без истории изменений, с формулами, которые ломались при найме и увольнении в середине месяца.
- Праздники, больничные и переработки учитывались по памяти. Доступ к данным о выплатах держался на доверии.
Такая схема работает до первого спора о компенсации при увольнении, до ошибки в выплате, которую заметили через квартал, и до отпуска самого HR, когда выясняется, что закрыть месяц больше некому.
Подход
Решение
Обучать команду не пришлось ни дня. Сотрудник живёт в мессенджере, который у него и так открыт: заявка занимает полминуты, логин и инструкция не нужны. Руководитель согласовывает одной кнопкой прямо в уведомлении. Учиться работе с интерфейсом надо только HR и администраторам — тем, кто и так работает в панели каждый день.
Главное в архитектуре — отсутствие повторного ввода. Одно согласование само обновляет календарь команды, зарплатный лист и баланс отпускных дней, а сотрудник получает ответ в тот же чат, где спрашивал.
Внутри системы — кадры и структура команд, отсутствия, баланс отпускных дней, учёт часов и расчёт зарплаты. Дальше в кейсе — по каждому из этих участков.
- Сотрудник отправляет заявку боту в Telegram
- Заявка сразу появляется у работодателя в панели
- Работодатель согласовывает одной кнопкой
- Сотруднику приходит ответ в тот же чат
- Календарь, зарплатный лист и баланс обновились сами
Спишется 3 дня, останется 13. 13:02
Событие добавлено в календарь команды. 13:04
Событие появилось в общем календаре и исчезнет, если заявку отменят.
Списание идёт с самого старого остатка, чтобы дни не сгорели.
Между заявкой и закрытым зарплатным листом — одно нажатие. HR не переносит отпуск ни в календарь, ни в ведомость: это происходит само. В истории остаётся, кто и когда согласовал.
Персонал
Кадры и структура команды
ИТ-отдел разбит на команды: Leadership & PMO, Platform, Web, Mobile, QA и DevOps. У каждой свой руководитель — по нему строится маршрут согласования заявок и адресация уведомлений.
Пять форм контракта и четыре модели оплаты труда работают в системе одновременно.
Команды и руководители
Формы контракта
Условия оплаты
Приём и увольнение
Список сотрудников с фильтрами по статусу и командам.
Отсутствия
Отпуск, больничный, отгул
Три типа отсутствий с разными правилами — и это принципиально, потому что смешать их в одну «заявку» значит потерять смысл каждого.
Все три видны в карточке сотрудника вместе с остатком дней и историей.
Отпуск
Больничный
Отгул
Остаток, начисления и использование за год, разбивка по годам с датами сгорания.
Баланс
Учёт отпускных дней: начисление и списание
Остаток отпускных дней ведётся журналом движений, как в бухгалтерии. Каждое изменение баланса — отдельная запись с датой, источником и автором. Раньше остаток хранился одним полем в карточке сотрудника и нигде не считался. Хранить остаток одним числом — типичная архитектурная ловушка B2B-систем: спор при увольнении требует истории, а не числа. Базовая норма — 28 календарных дней.
- Начисление — одна двенадцатая годовой квоты за каждый прошедший месяц, крон отрабатывает первого числа. Пропорция по дням применяется только к году приёма; отсутствия начисление не уменьшают. Наивное округление дало бы за год 27,96 вместо 28, поэтому месяц начисляет разность накопленных округлённых значений: сумма за год равна квоте ровно.
- Списание — FIFO. Правило выбрано в пользу сотрудника: сначала расходуются самые старые дни, поэтому перенесённый остаток уходит раньше свежего начисления и меньше сгорает.
- Перенос и сгорание — отдельные записи журнала: неиспользованный остаток переносится на год, затем сгорает, раз в год по расписанию.
- Корректировка — запись с обязательным комментарием и автором, доступная по отдельному разрешению. В минус баланс не уходит: проверка стоит и в форме, и в сервисе.
- Отпуск сверх остатка заявку не блокирует: дни делятся на оплачиваемую и неоплачиваемую части — оплачиваемые списываются из журнала, неоплачиваемые уменьшают базу без компенсации.
Интеграции
Учёт рабочего времени
Система не заставляет команду вести учёт заново в новом интерфейсе — она забирает данные оттуда, где люди уже работают, и приводит их к одному виду.
Источник назначается индивидуально каждому сотруднику.
Hubstaff — время и активность
Worksection — проекты и задачи
Google Calendar — календарь команды
Telegram и REST API
Синхронизация по расписанию
Часы с привязкой к проектам и процентом активности; видно время последней синхронизации.
Деньги
Расчёт зарплаты
Зарплатный лист создаётся одним действием. Система набирает ростер по всем активным сотрудникам, подтягивает часы из трекеров, согласованные отсутствия, государственные праздники и регулярные надбавки — и считает каждую строку.
Лист проходит цикл: набор ростера → черновик → утверждён → выплачен. После утверждения суммы замораживаются: последующие изменения в часах и отсутствиях уже не переписывают закрытый месяц. Это то свойство, ради которого систему и строят — историю нельзя переписать задним числом.
Доверие
Прозрачность: любую сумму можно разложить
Главный вопрос к любой зарплатной системе — «откуда взялась эта цифра». Здесь на него отвечает сама система: каждая строка раскрывается до формулы с подставленными числами — база за отработанные дни, компенсация праздников, надбавки, коэффициент продуктивности, понижающий коэффициент, итог начислено и к выплате.
Сотруднику можно открыть расчёт целиком. Тот же расчёт выгружается в PDF для бухгалтерии.
Проверки
Контроль качества данных
Система сама помечает строки, которые нельзя закрывать не разобравшись: ноль часов у почасового сотрудника, несогласованный отгул внутри периода, отсутствующий курс валюты, фиксированная выплата при наличии отсутствий. У каждого флага — объяснение, что именно не так и как это повлияло на сумму.
Ошибки видны в черновике, до закрытия периода. Это дешевле на порядок.
Выплаты
Бонусы, выплаты и компенсации
Всё, что влияет на итоговую сумму, живёт внутри системы и попадает в расчёт автоматически — никаких отдельных табличек с премиями, которые HR потом сводит вручную.
Настраивается один раз в карточке сотрудника и применяется к каждому следующему периоду.
Регулярные надбавки
Разовые премии и компенсации
Удержания
Компенсации отсутствий
Сверхурочные и валюта
Надбавки с периодами действия и переключателем активности.
Аналитика
Отчёты по сотруднику
Руководителю нужно понимание по конкретному человеку. На одной странице собраны средние часы в день, суммарное отработанное время, процент активности, дни отпуска, больничных и отгулов, индекс продуктивности, действующие надбавки и их влияние на фонд оплаты труда, динамика часов и история выплат.
Отдельно — счётчик дней до окончания контракта: на поиск замены остаётся время.
Хронология
Сроки и ритм разработки
Фактическое время разработки — около 80 человеко-часов. Это примерно две рабочие недели одного разработчика: столько заняли вместе кадры и отсутствия, учёт рабочего времени, расчёт зарплаты, интеграции и отпускной баланс.
Активная фаза — апрель и май: около 60 часов, три четверти всего времени. В них уместилось всё, что считает деньги: ядро расчёта зарплаты, правила оплаты, второй источник часов и внешние интеграции. До неё — примерно 20 часов на каркас, кадры, права, API и учёт времени: двадцать пятого апреля 2026 года в панели появились живые учётные записи, и компания перестала вести кадры в таблицах. После — точечные доработки на уже работающем продукте.
Цифры сняты из истории репозитория: коммиты сгруппированы в рабочие сессии по интервалам между ними, поэтому часы — оценка снизу, а не выгрузка тайм-трекера.
Модули доезжали по мере готовности, а не одним релизом в конце. Влитые pull request приходились на апрель, май и июль, а выкладка на основной ветке каждый раз запускалась вручную. Так можно работать, когда откат на предыдущую версию стоит одну команду, а на каждой ветке идёт конвейер стиль → анализ → тесты, три шага параллельно.
На запуске команда получила не заготовку, а рабочий контур — кадры, отсутствия и учёт времени, — и пользовалась им, пока дописывались правила оплаты, интеграции и отпускной баланс. Обычный для нас порядок: сначала то, чем можно пользоваться завтра, потом то, что считает деньги. Ждать «когда будет готово всё» не пришлось ни дня.
Эффект
Коммерческий эффект: часы и деньги
Система окупается часами, которые перестали тратиться, и ошибками, которые перестали доходить до выплаты. Часы считаются просто: ниже работа, которая раньше делалась руками каждый месяц, и что от неё осталось. Ошибки считаются сложнее, но одна недоплата, всплывшая через квартал, обходится дороже, чем весь сэкономленный месяц.
| Что делали руками каждый месяц | Было | Стало |
|---|---|---|
| Сборка зарплатной ведомости в таблицеРостер, часы, отсутствия, надбавки, сверка итогов | 8–16 ч | 1–2 ч |
| Перенос часов из трекеровВыгрузка, копирование, привязка к проектам | 4–8 ч | 0 |
| Подсчёт и сверка остатков отпускаНачисления, переносы, сгорание | 2–4 ч | 0 |
| Ведение заявок в чатах, таблице и календареОдин и тот же отпуск в четырёх местах | 3–6 ч | 0 |
| Разбор споров «сколько у меня дней»Поднять переписку, пересчитать, объяснить | 1–3 ч | 0 |
| Ручной работы в месяц | 18–37 ч | 1–2 ч |
Оценка для компании на 30 человек — подставьте свои объёмы и ставки HR-менеджера и бухгалтерии, чтобы получить сумму в деньгах.
Что система приносит за год и за два. Каждый месяц она возвращает HR и бухгалтерии два-четыре полных рабочих дня. За год набегает 24–52 рабочих дня, за два года — от 48 до 105. Вся разработка вместе с интеграциями, отпускным журналом и маршрутизацией уведомлений заняла около 80 человеко-часов — порядка десяти рабочих дней, — поэтому вложенное время возвращается за первые три-пять месяцев работы, а дальше идёт чистый плюс.
Те двадцать часов, что довели систему до запуска, окупились в первый же месяц. Дальше эффект только накапливается: система продолжает возвращать те же два-четыре дня ежемесячно, пока компания ей пользуется. Счёт идёт во времени, поэтому цифры переносятся на любую компанию: подставьте свои ставки, и получится сумма.
Полторы–четыре рабочие недели в год, которые HR и бухгалтерия возвращают себе из рутины. Это самая скучная и самая предсказуемая часть окупаемости.
Переплата и недоплата, спорная компенсация при увольнении, забытая надбавка. Одна такая ошибка стоит дороже месяца сэкономленных часов — и всплывает в самый неудобный момент.
Один рабочий контур на все процессы. Стек открытый: лицензий нет, размещение в своей инфраструктуре, развитие своими силами без привязки к поставщику.
Эффект
Практический эффект: меньше держать в голове
Дороже всего обходится нагрузка, которая остаётся в голове. Помнить остаток дней, помнить, кому писать, помнить, что надо проверить перед выплатой, — всё это занимает внимание, даже когда человек занят другим. Система забирает это на себя.
- Сотрудник не держит в голове остаток дней, не ищет, кому писать, не заполняет заявление. Один канал — тот, что и так открыт. Осваивать нечего: интерфейса, которому надо учиться, для него просто нет.
- Руководитель не выясняет, кто ещё из команды в отпуске в эти даты — это в самом уведомлении. Решение принимается одной кнопкой, без переключения в другую систему и без возврата к задаче позже.
- HR не помнит правила начисления, переноса и сгорания — их помнит система. И не проверяет вручную, что ничего не забыл: подозрительные строки помечены сами.
- Бухгалтерия не выясняет, откуда взялась сумма: расчёт раскрывается до формулы с подставленными числами.
- Компания перестаёт зависеть от одного человека. Правила живут в системе. HR может уйти в отпуск, заболеть или уволиться — регламент останется на месте.
- Никто не сверяет вручную календарь, таблицу и ведомость между собой — расхождению между ними просто неоткуда взяться.
Три приёма, которыми это сделано:
- Система решает за человека всё, что может решить сама. Рабочие дни, государственные праздники по стране сотрудника и курс валюты подставляются автоматически. Спрашивают только то, что действительно требует решения человека.
- Подсказка приходит в момент решения. Остаток дней и пересечения с отпусками коллег показаны прямо в заявке, там, где решение принимается. Искать их в отдельном отчёте не нужно.
- Ошибки ловит система. Ноль часов у почасового, несогласованный отгул, отсутствующий курс — всё это помечено в черновике. Не нужно помнить чек-лист проверок перед закрытием месяца.
Фундамент
Технический фундамент: почему это надёжно
Внутренняя система живёт годами и переживает несколько составов команды. Поэтому надёжность здесь измеряется одним: можно ли через два года безопасно поменять правило расчёта и не сломать закрытые периоды. Ниже — шесть опор, каждая из которых проверяется по коду.
21 модель и 42 класса в слое сервисов: бизнес-логика вынесена из контроллеров и панели в сервисы. Расчёт зарплаты — отдельное ядро из калькулятора, сборщика ростера, средних заработков и рабочих дней. Источники часов закрыты общим интерфейсом: резолвер появился под второй трекер и стоил калькулятору 7 вставок и 8 удалений, третий добавляется уже без правок в нём. Модули связаны событиями и очередями.
Код держится PSR-12 и единого форматтера, поверх идёт статический анализ PHPStan пятого уровня с расширением под Laravel — типы и обращения к моделям проверяются до запуска. Конвейер «стиль → анализ → тесты» проходит на каждой ветке, три шага параллельно.
64 тестовых класса, 497 тестовых методов, 11 656 строк тестов. Под проверкой модели оплаты, начисление, перенос и сгорание отпускных дней, API и синхронизация трекеров. Тесты идут на базе в памяти, отдельная поднятая база данных для прогона не нужна.
Схема описана 55 миграциями на 1 844 строки, уникальные индексы — в 21 файле миграций. Баланс отпускных дней хранится журналом движений, утверждённый период неизменяем. Фоновые задачи и регулярные прогоны идемпотентны: пропущенный запуск добирается следующим, без задвоений.
Выкладка идёт в два слота: новая версия собирается в свободном, переключение — сменой симлинка, откат на предыдущую версию — одной командой. Перед миграцией снимается бэкап базы, после переключения работает health-check с авто-откатом. Локальное окружение поднимается одной командой в контейнерах.
17 архитектурных решений записаны вместе с причиной и отвергнутыми альтернативами — раздел альтернатив есть в каждом. Рядом 9 записей журнала изменений и 18 спек: 13 активных и 5 в архиве. Систему можно передать другой команде, не восстанавливая логику по коду.
Двигайте изображение, чтобы рассмотреть
Соберём такую же систему под ваш бизнес
Отсутствия и согласования, учёт времени, расчёт зарплаты, бонусы и компенсации, интеграции с вашими сервисами — контур настраивается под ваши регламенты. Считаем на ваших цифрах, сколько часов в месяц он снимет с HR-менеджеров и бухгалтерии, и показываем на демонстрационных данных, как система ведёт этот учёт.
Готовое ядро можно взять за основу: ядро расчёта, отпускной журнал, права и интеграции уже написаны, покрыты тестами и задокументированы. Это не нужно писать заново — и вы получаете код, который сможет развивать любая команда.
Подходит компаниям на 20–300 человек: продуктовым студиям и аутсорсу, распределённым командам в нескольких странах, агентствам и производству.