Платёжные ведомости
Роут: /payroll
API: GET /api/v1/payroll, POST /api/v1/payroll/calculate
Что видит пользователь
Страница расчёта и управления зарплатными ведомостями. Вверху — фильтры (ТТ, период), ниже — таблица с расчётами, внизу — кнопки действий.
Фильтры
| Фильтр | Тип | Значения | Default |
|---|---|---|---|
| Торговая точка | Select | Список ТТ | Обязательный — первая ТТ |
| Период | Month picker | Месяц + год | Текущий месяц |
- Query params:
store_id,period(форматYYYY-MM) - При смене фильтра — перезагрузка данных
Таблица
Колонки
| Колонка | Данные | Примечание |
|---|---|---|
| Сотрудник | employee_name | Кликабельное — переход в карточку |
| Роль | role | Бейдж |
| Торговая точка | store_name | |
| План часов | planned_hours | Из расписания |
| Факт часов | actual_hours | Из shift records |
| Перерывы | total_breaks | Суммарные минуты перерывов |
| Чистые часы | net_hours | actual_hours - total_breaks |
| Формула | formula_display | Например “150 ₽/ч” или “фикс 45 000 ₽“ |
| Сумма | amount | Рассчитанная сумма в рублях |
| Статус | status | Бейдж (см. ниже) |
Статусы (бейджи)
| Статус | Цвет | Описание |
|---|---|---|
calculated | Синий | Рассчитано, ожидает подтверждения |
confirmed | Оранжевый | Подтверждено, ожидает оплаты |
paid | Зелёный | Оплачено |
Действия
Кнопки в шапке таблицы
| Кнопка | Видимость | API | Описание |
|---|---|---|---|
| Рассчитать | Franchise, Franchisee | POST /api/v1/payroll/calculate | Создаёт или пересчитывает ведомость за период |
| Подтвердить все | Franchise, Franchisee | POST /api/v1/payroll/{id}/confirm (batch) | Подтверждает все записи со статусом calculated |
| Экспорт CSV (по записи) | Franchise, Franchisee | GET /api/v1/payroll/{id}/export | Скачивает CSV по конкретной ведомости |
Действия в строке
| Действие | Видимость | API |
|---|---|---|
| Подтвердить | Franchise/Franchisee + status=calculated | POST /api/v1/payroll/{id}/confirm |
| Отметить оплаченным | Franchise/Franchisee + status=confirmed | POST /api/v1/payroll/{id}/mark-paid |
Логика “Рассчитать”
- Клик → модалка подтверждения: “Рассчитать ведомость за {месяц} для {ТТ}? Если ведомость уже существует, она будет пересчитана.”
- API:
POST /api/v1/payroll/calculateс{ store_id, period } - После успеха: перезагрузить таблицу, toast “Ведомость рассчитана”
- Если нет формул для сотрудников — предупреждение: “Для N сотрудников не задана формула зарплаты”
Логика “Подтвердить”
- Модалка: “Подтвердить начисление {сумма} для {сотрудник}?”
- API:
POST /api/v1/payroll/{id}/confirm - После успеха: обновить статус →
confirmed, toast “Подтверждено”
Логика “Отметить оплаченным”
- Модалка: “Отметить как оплаченное {сумма} для {сотрудник}?”
- API:
POST /api/v1/payroll/{id}/mark-paid - После успеха: обновить статус →
paid, toast “Отмечено как оплаченное”
CSV Export
- Кнопка “Экспорт CSV” в строке ведомости → скачивание файла
- API:
GET /api/v1/payroll/{id}/export(файл формируется для конкретной ведомости) - Формат: UTF-8 с BOM (для корректного открытия в Excel)
- Колонки в CSV совпадают с таблицей
Нет bulk-экспорта «все за период»
Массовый экспорт по
store_id + period— planned. Сейчас только per-record экспорт.
Состояния
| Состояние | Что показываем |
|---|---|
| Загрузка | Skeleton-таблица |
| Пусто (нет записей) | “Ведомость за {месяц} ещё не рассчитана” + кнопка “Рассчитать” |
| Ошибка | ”Не удалось загрузить данные” + “Повторить” |
| Нет формул | Warning: “Для N сотрудников не задана формула зарплаты. Настройте формулы в карточках сотрудников.” |
Ролевой доступ
| Роль | Доступ |
|---|---|
| Franchise | Полный доступ: расчёт, подтверждение, оплата, экспорт |
| Franchisee | Просмотр + расчёт + подтверждение + оплата + экспорт (только свои ТТ) |
| Менеджер ТТ | Только просмотр |
| Кассир | Нет доступа — 403, редирект |
Переходы
| Откуда | Куда | Триггер |
|---|---|---|
| Ведомости | Карточка сотрудника | Клик по ФИО |
| Sidebar | Ведомости | Пункт “Платёжные ведомости” |