Программа учёта отпусков собирает заявки на ежегодный, дополнительный и неоплачиваемый отпуск, проводит их через согласование руководителя и в любой момент показывает сотруднику остаток дней. Коротко: она заменяет столбец «осталось дней» в таблице журналом отпусков, где записано каждое движение и никто не может вручную переписать итог. При правильной настройке вопросы «сколько у меня осталось?» в отдел кадров прекращаются, а согласованный отпуск сам попадает в табель и расчёт зарплаты.
Зачем нужна программа учёта отпусков?
Процесс на почте и таблицах ломается в трёх местах: непонятно, у кого застряла заявка, трое из одной команды незаметно берут одну и ту же неделю, а к концу года остатки не сходятся. Программа решает все три проблемы на одном экране.
- Сотрудник подаёт заявку с телефона или в браузере и сразу видит свой остаток.
- Заявка уходит непосредственному руководителю, а при его отсутствии заместителю.
- Календарь команды до согласования показывает, кто уже отсутствует в эти даты.
- Согласованный отпуск списывается с остатка и передаётся в табель и зарплату.
- В конце года отдел кадров видит перенос и неиспользованные дни в одном отчёте.
Почему остаток отпуска не должен быть одним полем?
Самая частая ошибка — хранить в карточке сотрудника одно число «осталось: 12». Оно незаметно искажается, когда кто-то его правит, заявку отменяют или начисление считают неверно, и причину уже никто не найдёт. Правильная модель считает остаток как сумму журнала: начисление со знаком плюс, согласованный отпуск со знаком минус, корректировка — отдельной строкой с причиной. Строки не удаляются; ошибка исправляется сторнирующей записью.
Остаток отпуска вычисляется, а не хранится: начисление, использование и корректировка — отдельные строки, и ни одна не удаляется. Ответ на вопрос «почему здесь такое число?» всегда есть в журнале.
В примере ниже остаток берётся из журнала, а заявки на согласовании резервируют дни, поэтому один сотрудник не может потратить одни и те же дни двумя заявками.
type LeaveEntry = {
employeeId: string;
days: number; // + accrual or correction, - approved leave
reason: 'accrual' | 'leave' | 'correction' | 'carry_over';
requestId: string | null;
createdAt: Date;
};
// The balance is never stored as a single field; it is the sum of the ledger.
function balance(entries: LeaveEntry[], employeeId: string): number {
return entries
.filter((e) => e.employeeId === employeeId)
.reduce((sum, e) => sum + e.days, 0);
}
// Pending requests reserve days so two requests cannot spend the same balance.
function canRequest(
entries: LeaveEntry[],
pendingDays: number,
employeeId: string,
requestedDays: number,
): boolean {
return balance(entries, employeeId) - pendingDays >= requestedDays;
}Как настроить заявку и согласование?
Маршрут согласования кажется простым, но если его запрограммировать до того, как записаны правила, он обрастает исключениями. Заранее нужны письменные ответы: сколько этапов согласования, кому уходит заявка в отсутствие руководителя, можно ли вносить отпуск задним числом и кто это делает, как восстанавливается остаток при отмене согласованного отпуска.
Права разделяются с самого начала: сотрудник видит только свои заявки, руководитель — свою команду, отдел кадров — всех, и только он вносит корректировки. Это реализуется через роли пользователей и авторизацию (RBAC). Напоминания о заявках и ежегодные начисления выполняются как запланированные задачи (cron); один и тот же период не должен начисляться дважды.
Как рассчитывается право на ежегодный отпуск?
Продолжительность отпуска зависит от законодательства страны и может зависеть от стажа, возраста и условий труда; коллективный договор или политика компании могут давать больше дней. Поэтому сроки не зашиваются в код, а хранятся в датированной таблице правил, утверждённой отделом кадров и юристом. При изменении правила прошлые периоды сохраняют старый расчёт. Отдельно решается, исключаются ли выходные и праздники и как считать день отпуска при сменном графике — здесь данные должны совпадать с программой планирования смен. Статья не является юридической консультацией.
Связь с учётом времени и зарплатой
Согласованный отпуск должен отображаться в системе учёта рабочего времени как «отпуск», а не «прогул», иначе учёт рабочего времени персонала (PDKS) засчитает день как пропуск. В расчёт зарплаты попадает только согласованный отпуск закрытого периода через интеграцию с бухгалтерией и зарплатой. Больничные документы могут относиться к чувствительным персональным данным: открывать их должен только отдел кадров. Общие принципы — в статье о соответствии KVKK.
Готовая программа или заказная разработка?
Компании с одним офисом и стандартным графиком обычно хватает модуля отпусков готовой HR-системы. Заказная разработка оправдана при нескольких группах сотрудников с разными коллективными договорами, сменной и проектной работе, тесной интеграции с собственной системой учёта или ERP и многоступенчатом согласовании. Критерии выбора описаны в статье заказное ПО или готовое решение; в любом случае убедитесь, что можете выгрузить все данные.
Итог
Хорошая программа учёта отпусков считает остаток по журналу, привязывает согласование и права к письменным правилам, хранит нормы в датированной таблице и сама передаёт согласованный отпуск в табель и зарплату. Если хотите спроектировать кадровые процессы вместе с нами, посмотрите страницу корпоративные решения или запросите смету.