1.4.3 Пользовательские роли с правами (Yuma-стиль)

Источники

СлойДокумент
ТребованиеBR 1.4.3
Бизнес-спекаРоли (новая)
Бизнес-спекаСотрудники (обновлена)
Бизнес-спекаЗарплата (обновлена)
Бизнес-спекаРолевая модель (обновлена — два слоя)
БэкендUser Service Data Model (4 новые таблицы + salary_formulas изменения)
БэкендUser Service API (7 новых эндпоинтов /roles/, изменения /employees/, internal)
БэкендAuth Service API (JWT payload, /auth/me, /internal/auth/validate)
БэкендAuth Service Data Model (Redis-кэш user_permissions)
ФронтендРоли — Список (новый)
ФронтендРоли — Карточка (новый)
ФронтендСотрудники — Карточка (обновлён)
ФронтендСотрудники — Список (обновлён)

Прогресс

  • User Service — миграции, Roles CRUD, employees update, internal permissions
  • Auth Service — JWT payload, /auth/me, /internal/auth/validate, Redis-кэш
  • Admin Franchise — BFF proxy + Web (новые страницы + обновления)
  • Миграция данных на тестовый VPS (см. ниже)

Порядок реализации

  1. User Service — ядро, нет зависимостей
    • Фаза 1: миграции (SQL)
    • Фаза 2: Entity/Repo/DTO + permission catalog (константа)
    • Фаза 3: Roles CRUD service + controller
    • Фаза 4: Employees service update (принимать roles[]) + internal permissions
    • Фаза 5: Seed системной роли «Администратор»
  2. Auth Service — зависит от User Service
    • JWT payload, /auth/me, /internal/auth/validate расширение, Redis-кэш
  3. Admin Franchise — зависит от обоих бэкендов (можно начать параллельно с Auth Service)
    • BFF proxy routes
    • Web: PermissionContext, страницы Roles, обновления Employees

Разовая миграция данных (после деплоя миграций, до запуска первой сессии)

Тестовая среда, реальных данных нет

Подробнее — BR 1.4.3 §9.

  1. Создать системную роль «Администратор» в roles со всеми permission-ключами из каталога в role_permissions (is_system=true)
  2. Привязать admin@erp.local (enum admin_franchise) к этой роли через employee_roles
  3. Занулить legal_entities.owner_user_id для всех владельцев партнёров (перед удалением):
    UPDATE legal_entities SET owner_user_id = NULL
    WHERE owner_user_id IN (SELECT id FROM employees WHERE role = 'admin_franchisee');
  4. Удалить всех сотрудников, кроме admin_franchise:
    DELETE FROM employees WHERE role IN ('admin_franchisee', 'manager', 'cashier');
    (Каскадно снесутся employee_stores, employee_legal_details, shift_*, employee_roles и т.п.)

Deferred (подтверждено для отдельных BR)

  • Per-ТТ формулы зарплаты (role × store → formula)
  • Min/Max лимиты на POS-операциях
  • Миграция Store/Catalog/Warehouse/Order сервисов с switch(role) на permission-checks
  • Судьба enum-слоя admin_franchise / admin_franchisee в новой модели

Ссылки