krona-staff/docs/REQ-001-PAYROLL.md
Ochenstarik 3464998168
Some checks are pending
ci / verify (push) Waiting to run
feat: add secure attendance portal and payroll foundation
2026-09-24 15:59:38 +07:00

131 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# REQ-001: Универсальный расчёт заработной платы
- Статус: утверждено владельцем 2026-09-23, реализуется
- Контур: управленческий учёт. Официальный расчёт (НДФЛ, страховые взносы, МРОТ, кадровые документы) — следующий этап, схема данных готовится под него заранее
- Проверочный пример: таблица владельца «Доходы и расходы 2026 год», листы «График» и «Расчет ЗП с доп. поваром»
## 1. Задача
Модуль считает переменную часть зарплаты **для любой организации**, а не для одного кафе. Главный сценарий — переход с Excel: основная масса малого бизнеса ведёт расчёт в таблицах со своими формулами, и продукт обязан принять эти формулы, а не навязать свои.
Отсюда три обязательных свойства:
1. **Формулу задаёт клиент.** Правило оплаты — не код, а настройка: собирается в визуальном конструкторе из блоков, хранится как структура, показывается человеку словами.
2. **Переход без потерь.** Историю из таблицы можно загрузить, сверить с расчётом модуля и убедиться, что суммы совпадают, прежде чем отказываться от Excel.
3. **Формулы меняются со временем.** Изменение ставки или правила создаёт новую версию; прошлые ведомости пересчёту не подлежат и воспроизводятся в точности.
Остальное — учёт смен (факт из терминала плюс подтверждение управляющего), ведомость, выплаты, остатки, мониторинг и кабинет сотрудника в мобильном приложении.
## 2. Словарь
| Термин | Значение |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| Подразделение (`OrganizationUnit`) | Точка, цех, магазин, участок. К нему привязаны показатели дня и смены |
| Показатель дня | Числовая величина подразделения за день: выручка, число чеков, объём производства. Состав определяет клиент |
| Позиция | Оплачиваемая строка дня сотрудника: заказ, доставка, услуга, партия. Имеет атрибуты: сумма, дальность, тип клиента |
| Смена (`WorkSession`) | Факт работы сотрудника в подразделении за операционный день |
| Правило оплаты (`PayRule`) | Дерево блоков, по которому считается начисление. Версионируется |
| Параметр сотрудника | Значение, которое правило подставляет для конкретного человека: ставка, процент, надбавка, гарантия, план |
| Фонд дня | Сумма, которую участники смены делят между собой. Задаётся правилом подразделения |
| Ведомость (`PayrollRun`) | Расчёт за период со строками по сотруднику и дню |
| Остаток | Начислено минус выплачено нарастающим итогом. Плюс — долг перед сотрудником |
## 3. Конструктор правил
Правило собирается из блоков. Набор покрывает схемы, которые встречаются на практике:
| Блок | Назначение |
| -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| Показатель, параметр, часы, число участников | Источники значений |
| Сложение, вычитание, умножение, деление | Арифметика |
| Процент от значения | Процент от выручки, от продаж, от суммы заказов |
| Доля из фонда | Командная схема: фонд делится между участниками смены |
| Сумма и количество позиций с фильтром | Сдельщина: «сумма заказов дешевле 5000», «количество доставок» |
| За каждую позицию | Оплата за единицу, в том числе по шкале от атрибута позиции |
| Шкала по ступеням | Ставка выбирается по достигнутому уровню и применяется ко всей сумме |
| Прогрессивная шкала | Каждая ступень применяется к своему слою: 3% до 100 тыс, 5% дальше |
| Условие | Премия при выполнении условий: выручка выше порога и на смене не меньше трёх человек |
| Наибольшее, наименьшее | Гарантированный минимум и потолок выплаты |
| Округление | Шаг округления строки начисления |
| Ночные, сверхурочные, праздничные часы | Доплаты, обязательные по ТК РФ: 20% за ночные, 1,5 и 2 за переработку, двойная за праздник |
| Окно агрегации | Показатель или позиции берутся за смену, день, неделю, декаду или месяц: фонд считается на дне, а прогрессивная шкала обычно на месяце |
Полный разбор отраслевых схем — в [справочнике схем](PAYROLL-SCHEMES-CATALOGUE.md); ограничения, которые нельзя нарушать, — в [правовых ограничениях](PAYROLL-LEGAL-LIMITS.md).
Примеры правил, которые из этого собираются:
```
Повар в команде: доля из фонда + ставка × часы + надбавка
Администратор: наибольшее(процент от выручки + ставка × часы; гарантия смены)
Продавец: оплата смены + прогрессивный процент от личных продаж
Курьер: ставка × часы
+ процент от суммы заказов дешевле 5000 ₽
+ за каждый заказ дороже 5000 ₽: по шкале дальности (250 или 500 ₽)
Мастер услуг: наибольшее(50% своих клиентов + 35% клиентов салона; гарантия смены)
Премия за выручку: если выручка ≥ порога и участников ≥ 3, добавить премию
```
Каждое правило движок умеет пересказать словами — этот же текст показывается сотруднику в расшифровке суммы.
### 3.1 Фонд и неполная смена
Фонд подразделения за день задаётся отдельным правилом (например, 11% от выручки). Он распределяется **по времени присутствия**: в каждый отрезок смены фонд делится между теми, кто в этот момент работал. Если участник ушёл раньше, он получает долю только за свои часы, а остальные забирают оставшуюся часть. При равных сменах это в точности «фонд ÷ число участников». Вес участника настраивается: полный участник, половина (например, дополнительный сотрудник) или без участия.
### 3.2 Округление и хранение
Каждая строка начисления округляется с настраиваемым шагом, по умолчанию до рубля. Остаток от округления остаётся в фонде и не приписывается сотруднику. Суммы хранятся в копейках (`BIGINT`), валюта — ISO 4217.
### 3.3 Версии правил
Правило и его параметры не редактируются на месте: правка создаёт следующую версию с датой начала действия. Ведомость хранит ссылку на версию и полный след расчёта (входные показатели, фонд, доля, параметры, текст правила), поэтому любую сумму можно объяснить и воспроизвести спустя год.
## 4. Периоды, ведомость, выплаты
- Период настраивается: неделя (в том числе начиная с четверга, как в таблице владельца), две недели, месяц.
- Статусы ведомости: `draft → calculated → approved → paid`. После `approved` строки не пересчитываются; исправление — отдельной корректировкой.
- Выплаты вводятся фактической суммой; разница с начисленным автоматически становится остатком и переносится дальше.
- Реестр начислений и выплат — только на добавление, на уровне прав базы данных.
## 5. Учёт часов
- Источник — события терминала (`check_in` / `check_out`) с идемпотентным ключом.
- Смена попадает в расчёт только после подтверждения управляющим.
- Корректировка часов не меняет исходные события: правка хранится отдельно с причиной.
- Незакрытая смена помечается аномалией после нормы плюс два часа.
## 6. Переход с Excel
1. **Загрузка таблицы.** Клиент загружает свой файл; мастер определяет листы и колонки: сотрудник, дата, подразделение, часы, сумма, показатели дня.
2. **Подбор формулы.** Система предлагает пресет отрасли и подбирает параметры сотрудников по истории, после чего показывает, на скольких днях расчёт совпал с таблицей и где разошёлся.
3. **Разбор расхождений.** По каждому расхождению видно, из чего сложилась сумма модуля и какая сумма стоит в таблице. Обычно расхождения — это ручные правки в Excel или изменение ставки, не отражённое в формуле.
4. **Параллельный период.** Клиент неделю ведёт расчёт и в таблице, и в модуле, сверяет итоги и после совпадения отключает таблицу.
Проверка метода на реальной таблице владельца: правило «фонд 11% ÷ участники + 100 ₽/ч + личная надбавка» воспроизводит суммы поваров точно; администраторы считаются как «процент от выручки + почасовая, но не ниже 3000 ₽». Расхождения объясняются изменением ставок в течение года и ручными правками — что и подтверждает необходимость версий и режима сверки.
## 7. Мониторинг
Ежедневный экран по подразделению: показатели дня, кто на смене, фонд, начислено, доля фонда оплаты в выручке, неподтверждённые и незакрытые смены, дни без введённых показателей. Недельный и месячный итог — по ведомости.
## 8. Доступ
| Роль | Права |
| ----------- | ------------------------------------------------------------------------------- |
| Владелец | всё, включая утверждение ведомостей, правил и мониторинг по всем подразделениям |
| Управляющий | показатели, подтверждение смен, расчёт и выплаты по своему подразделению |
| Сотрудник | только свои смены, начисления, выплаты, остаток и расшифровка сумм |
Сотрудник получает доступ по record-level правам платформы (`scope: own`). Данные других сотрудников недоступны ни в API, ни в приложении.
## 9. Границы этапа
**Входит:** подразделения, сотрудники, показатели и позиции, конструктор правил с версиями, пресеты отраслей, приём отметок терминала, смены и подтверждение, расчёт, ведомость, выплаты, остатки, импорт из Excel и сверка, API для мобильного приложения, мониторинг.
**Не входит:** НДФЛ и страховые взносы, кадровые документы, отпуска и больничные, планирование графиков, выгрузка в 1С, официальный табель Т-13, автоматическая интеграция с кассой (предусмотрена точка расширения — показатель с источником «модуль»).
## 10. Вопросы, которые остаются к владельцу по его пресету
1. Дополнительный сотрудник и стажёр считаются в делителе фонда как половина участника? В таблице встречаются оба варианта.
2. Гарантия администратора (3000 ₽) — за смену любой длительности или пропорционально часам?
3. Премия за выручку: при каком пороге и какая сумма, и зависит ли она от числа участников смены?
4. Перенос остатка: бессрочно или закрывается в конце месяца?
5. Выплаты: только наличные или бывают переводы, и нужно ли фиксировать, кто выдал деньги?