Платёжные ведомости

Роут: /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_hoursactual_hours - total_breaks
Формулаformula_displayНапример “150 ₽/ч” или “фикс 45 000 ₽“
СуммаamountРассчитанная сумма в рублях
СтатусstatusБейдж (см. ниже)

Статусы (бейджи)

СтатусЦветОписание
calculatedСинийРассчитано, ожидает подтверждения
confirmedОранжевыйПодтверждено, ожидает оплаты
paidЗелёныйОплачено

Действия

Кнопки в шапке таблицы

КнопкаВидимостьAPIОписание
РассчитатьFranchise, FranchiseePOST /api/v1/payroll/calculateСоздаёт или пересчитывает ведомость за период
Подтвердить всеFranchise, FranchiseePOST /api/v1/payroll/{id}/confirm (batch)Подтверждает все записи со статусом calculated
Экспорт CSV (по записи)Franchise, FranchiseeGET /api/v1/payroll/{id}/exportСкачивает CSV по конкретной ведомости

Действия в строке

ДействиеВидимостьAPI
ПодтвердитьFranchise/Franchisee + status=calculatedPOST /api/v1/payroll/{id}/confirm
Отметить оплаченнымFranchise/Franchisee + status=confirmedPOST /api/v1/payroll/{id}/mark-paid

Логика “Рассчитать”

  1. Клик → модалка подтверждения: “Рассчитать ведомость за {месяц} для {ТТ}? Если ведомость уже существует, она будет пересчитана.”
  2. API: POST /api/v1/payroll/calculate с { store_id, period }
  3. После успеха: перезагрузить таблицу, toast “Ведомость рассчитана”
  4. Если нет формул для сотрудников — предупреждение: “Для N сотрудников не задана формула зарплаты”

Логика “Подтвердить”

  1. Модалка: “Подтвердить начисление {сумма} для {сотрудник}?”
  2. API: POST /api/v1/payroll/{id}/confirm
  3. После успеха: обновить статус → confirmed, toast “Подтверждено”

Логика “Отметить оплаченным”

  1. Модалка: “Отметить как оплаченное {сумма} для {сотрудник}?”
  2. API: POST /api/v1/payroll/{id}/mark-paid
  3. После успеха: обновить статус → 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ВедомостиПункт “Платёжные ведомости”

Ссылки