BUG-021 — Декомпозиция

Код

Проблема 1: employee_count в списке ролей

User Service

  • Проверить RoleService.list() — считает ли employee_count через JOIN/subquery из employee_roles
  • Проверить RoleListItem DTO — есть ли поле employee_count / employees_count
  • Если поле не заполняется — добавить COUNT query

Admin Web

  • pages/roles/ListPage.tsx — проверить имя поля в колонке (может employee_count vs employees_count)
  • shared/types/role.tsRoleListItem.employees_count или employee_count?

Проблема 2: роли и ТТ в списке сотрудников

User Service

  • Проверить EmployeeService.list() — возвращает ли EmployeeListItem.roles[]
  • Если нет — добавить обогащение: для каждого employee в списке JOIN employee_roles + roles.name + employee_role_stores → store names
  • Performance: для списка из N сотрудников делать N запросов store-names = N+1 problem. Решение: batch-запрос store names по всем уникальным store_ids списка

Admin Web

  • pages/employees/ListPage.tsx:
    • Колонка «Permissions-роли» — читать roles[].name (чипы)
    • Колонка «Торговые точки» — агрегировать roles[].stores[].name (уникальные)
    • После BUG-020 бэк отдаёт stores[{id, name}] вместо store_ids[uuid] — фронт нужно переключить
  • shared/types/employee.tsEmployeeListItem должен иметь roles: EmployeeRoleRef[]

Связь с BUG-020

BUG-020 (UUID вместо названий) фиксит карточку просмотра GET /employees/{id}. Этот баг — про список GET /employees (EmployeeListItem) и список ролей GET /roles (RoleListItem). Отдельные endpoint’ы, но похожая проблема.

Спеки

Спеки Сотрудники — Список и Роли — Список корректно описывают колонки. Баг в имплементации, не в спеках.