Веб-система для учета выполненных работ
Создали веб-систему, которая фиксирует выполненную работу для расчетов и помогла избавиться от ручной сверки данных.Клиент
Компания оказывает услуги по разработке цифровых продуктов. Ведет десятки контрактов с корпоративными заказчиками, формуруя команды под конкретные обязательства и сроки. В проектах участвуют штатные сотрудники и подрядчики, распределенные по разным часовым поясам. В пиковые периоды общее количество исполнителей может превышать 300 человек.
Учет времени в рамках такой бизнес-логики – часть финансовой и операционной ответственности. Выплаты сотрудникам напрямую зависят от подтвержденного объема работ, так что любые неточности в данных – это потенциальные денежные потери, конфликты и тень на репутации.
Сперва компания рассматривала готовые решения, но столкнулась с ограничениями рынка: ни один готовый сервис не закрывал задачу целиком. Тайм-трекеры фиксировали только часы, HR-системы – людей, финансовые инструменты – выплаты.
У клиента была собственная инженерная команда, но он осознанно не стал решать эту задачу внутри и в 2022 году обратился к нам.
Вызовы
Ключевые данные о выполненной работе существовали разрозненно: часы фиксировались в одних инструментах, сотрудники и роли — в других, а расчеты и выплаты происходили в третьих. Чтобы свести все это в одну картину, каждый расчетный период требовал ручной проверки и уточнений данных.
С ростом количества исполнителей и контрактов цена любой неточности возрастала. Такую схему невозможно было бы масштабировать, поскольку увеличение нагрузки не усиливало контроль, а лишь увеличивало число ручных операций и точек отказа.
Нам предстояло спроектировать систему так, чтобы расчеты могли выполняться автоматически – без ручных проверок, исключений и договоренностей вне системы.

Одна логика под разные роли
Для разных ролей должен использоваться один и тот же набор данных. Для HR – подтвержденный факт работы конкретного человека, для операционных команд – привязку этой работы к заказу, а для финансов – расчеты. При этом ни одна из ролей не должна интерпретировать данные по-своему или иметь возможность дополнять их вручную.

Единая точка фиксации
Данные не имели четко зафиксированного состояния. Часы могли быть заполнены, но не привязаны к конкретному обязательству; работа — выполнена, но без явного момента, после которого запись считается финальной. В системе не существовало понятного перехода между состояниями «в работе», «завершено», «подтверждено», из-за чего невозможно было однозначно определить, какие данные уже готовы для расчетов, а какие еще в процессе уточнения.
От ручной сверки к автоматическим расчетам
Определение факта выполненной работы
Мы начали с базового вопроса: что именно считать выполненной работой на уровне данных.
— Работа не может существовать без привязки к заказу или контракту. Запись о времени не имеет смысла без указания исполнителя, периода и контекста, в рамках которого эта работа выполнялась. Поэтому факт выполненной работы должен одновременно отвечать нескольким условиям: быть привязанным к конкретному исполнителю, относиться к заказу, попадать в расчетный период и иметь подтвержденный статус.
— Данные, не отвечающие этим условиям, нельзя использовать дальше – ни для отчетов, ни для расчетов, ни для передачи во внешние системы.
— Так мы зафиксировали единое основание для всего контура и заложили фундамент для следующих решений.
Статусы данных и момент финализации
Дальше нужно было определить момент, когда данные становятся пригодными для расчетов. Для этого мы ввели модель состояний и правила финализации.
— Запись о работе не считается готовой сразу после заполнения: она проходит этапы от черновика до подтвержденной записи. Только подтвержденные данные доступны для расчетов и экспорта.
— После закрытия расчетного периода записи внутри периода блокируются, чтобы в них нельзя было внести изменения. Это исключает правки задним числом и позволяет воспроизводить расчеты в любой момент без повторной ручной проверки.
Интеграции
Отдельное внимание мы уделили интеграции с финансовыми инструментами – например, QuickBooks (стандарт для компаний подобного масштаба в США). Поэтому систему проектировали не как замкнутый инструмент, а как источник данных для внешних контуров.
Любые расхождения в данных делают автоматическую передачу невозможной. Система передает наружу только финализированные и воспроизводимые записи. Это позволило встроить решение в существующий финансовый контур без усложнения и дублирования логики.
Аскетичный UX
Мы проектировали интерфейс как рабочий инструмент, а не как дашборд. Чем меньше вариантов действий, тем ниже вероятность ошибки. Сознательно убрали лишние сценарии, которые позволяли бы обходить правила или оставлять данные частично заполненными.
UX напрямую отражает модель данных и ограничения: нельзя сохранить запись без обязательных связей, нельзя изменить финализированные данные, нельзя пропустить шаг, от которого зависит корректность расчетов.
Технологии
Бэкенд
PHP
Бэкенд
Laravel
Фронтенд
Vue.js
Фронтенд
JavaScript
База данных
MySQL
Инфраструктура
Docker
Результат
До внедрения решения расчеты и выплаты держались на договоренностях между командами и ручной сборке. Более того – каждый расчетный период требовал проверки и участия людей, которые фактически являлись единственным гарантом корректности.
После внедрения системы расчеты начали опираться на зафиксированный факт выполненной работы. HR, операционные команды и финансы работают с одним и тем же подтвержденным набором данных.
Мы выстроили расчетный цикл так, чтобы он не требовал ручного контроля. Фиксация и финализация данных по заданным правилам позволили автоматизировать весь путь – от учета выполненной работы до расчетов и выплат.
Для бизнеса это означает предсказуемость: рост числа исполнителей и контрактов перестал пропорционально увеличивать операционную нагрузку и риски, а критичные процессы больше не зависят от внимательности отдельных сотрудников.
меньше ручных операций в расчетном цикле.
меньше исключений, требующих ручной обработки.
Что происходит дальше:
Мы получаем запрос, обрабатываем его в течение 24 часов и связываемся по указанным вами e‑mail или телефону для уточнения деталей.
Подключаем аналитиков и разработчиков. Совместно они составляют проектное предложение с указанием объемов работ, сроков, стоимости и размера команды.
Договариваемся с вами о следующей встрече, чтобы согласовать предложение.
Когда все детали улажены, мы подписываем договор и сразу же приступаем к работе.