RBAC Matrix — Сквозная проверка доступа

Используется всеми тестерами как regression suite. Прогоняется в каждый цикл. Зоной ответственности владеет T1.

Контекст багов: в базе есть массовые 403 (Manager на ТТ/ЮЛ, Franchise-only на создание ТТ, 403 на Склад/Заказы/Стоп-листы), что не соответствует BR 1.4.4. Это класс багов, не отдельные кейсы. Эта матрица — основной инструмент его выявления и регрессии после фиксов.

Источник правды

  • D:\Project\ERP\content-mirror\05-Business\Roles.md — три сценария scope сотрудника
  • D:\Project\ERP\content-mirror\08-Specs\Админка-Франшизы\Роли.md — permission catalog
  • BR 1.4.4 §3, §7

4 роли + критерии scope

РольScopeСоздаётся
Franchise ownerВся франшиза (ЮЛ, ТТ, сотрудники, каталог)При bootstrap
Franchisee owner (партнёр)Свои ЮЛ + их ТТ + сотрудники этих ТТТранзакционно с созданием ЮЛ type=franchisee
ManagerТолько назначенные ТТ через employee_role_storesЧерез форму “Сотрудники”
CashierОдин POS-контекст после PIN-логинаЧерез форму “Сотрудники”

Матрица по разделам бэк-офиса

Заполнить колонки Текущее при тестировании. Если расходится с Ожидание — баг.

Легенда:

  • Edit — полный CRUD в рамках scope
  • Read — просмотр в рамках scope
  • No — раздел не виден / 403
  • N/A — роль не работает в бэк-офисе (Cashier работает только на POS)

1. Дашборд / Главная

РазделFranchise — ожид.Franchise — фактFranchisee — ожид.Franchisee — фактManager — ожид.Manager — фактCashier — ожид.Cashier — факт
Открыть /dashboardReadReadReadN/A

2. Франшизы

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Просмотр своей франшизыReadNoNoN/A
Редактирование (type switch)Edit (вручную SQL)NoNoN/A

Известный баг: редактирование своей франшизы → 404 после Save. Внести в проверку Franchise.

3. Юридические лица

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Меню видно (type=corporate)ДаДа (свои)Только если legal_entities.readN/A
Меню скрыто (type=individual)СкрытоСкрытоСкрытоN/A
Список ЮЛВсеТолько своиПо legal_entities.readN/A
Создать type=franchiseeДа (только если corporate)NoNoN/A
Создать type=franchiseNo (только bootstrap)NoNoN/A
Редактировать (все поля)ЛюбоеТолько своиПо legal_entities.edit + scopeN/A
Удалить ЮЛДа (если нет ТТ)NoNoN/A
Suspend / ResumeДаNoNoN/A
Импорт xlsxДа (если corporate)NoNoN/A
Вкладка «Права» владельца партнёраДа (своих партнёров)No (своя же — не видит)NoN/A

4. Сотрудники

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Просмотр спискаВсе сотрудники франшизыТолько своих (по своим ТТ/ЮЛ)По employees.read (свои ТТ)N/A
Создание (manager/cashier)В любой ТТВ своих ТТПо employees.edit (обычно нет)N/A
РедактированиеЛюбогоТолько своихПо employees.editN/A
ДеактивацияЛюбогоТолько своихПо employees.editN/A
Назначение ролейЛюбых обычныхТолько обычных в своих ТТNoN/A

Известные баги: поиск ФИО не работает, создание сотрудника 500, редактирование роли с админа не работает.

5. Роли

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Список ролей (без скрытых)ВсеНазначенные своимПо roles.readN/A
CRUD пользовательских ролейДаNoПо roles.editN/A
Системная «Администратор» — protectedТолько renameNoNoN/A
Hidden роли владельцев партнёровНе видны в спискеНе видныНе видныN/A

6. Торговые точки

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Список ТТВсеСвои (по своим ЮЛ)Свои назначенныеN/A
Создать ТТДаДа (в своих ЮЛ)NoN/A
Редактировать ТТЛюбаяСвоиТолько статус/график своейN/A
Удалить ТТ (если unpublished)ДаNoNoN/A
Publish / UnpublishДаСвоиСвоюN/A
POS-терминалы CRUDДаСвоиСвояN/A
Столы CRUDДаСвоиСвояN/A

Жирный: известный баг — Franchisee не может создать ТТ («Only franchise role can perform this action»). По спеке должен мочь в своих ЮЛ.

7. Каталог — Товары

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Список товаровВсеАктивные товарыАктивные товары403 в админке
ДеталиЛюбойАктивныеАктивные403
CRUD товаровДаNoNo403
Удаление / восстановлениеДаNoNo403

8. Каталог — Категории / Модификаторы / Прейскуранты

РазделFranchiseFranchiseeManagerCashier
Категории GETДаДаДа403
Категории CRUDДаNoNoNo
МодификаторыCRUDRead (активные)Read (активные)403
Привязка модификаторов к товарамДаNoNoNo
Прейскуранты CRUDДаNo (по pricelist.edit)No403

9. Каталог — Стоп-листы

ДействиеFranchiseFranchiseeManagerCashier
ПросмотрВсе ТТСвои ТТСвоя ТТRead-only
Поставить / снять стопЛюбая ТТСвои ТТСвоя ТТ403

Известный баг: Стоп-листы — 403 у Manager (по спеке должна быть Своя ТТ).

10. Склад

РазделFranchise — ожид.фактFranchisee — ожид.фактManager — ожид.фактCashier — ожид.факт
Ингредиенты CRUDДаNoПо warehouse.edit403
Техкарты CRUDДаNoПо warehouse.edit403
ПриёмкиДаСвои ТТСвоя ТТ403
СписанияДаСвои ТТСвоя ТТ403
ОстаткиДаСвои ТТСвоя ТТ403

Известный баг: все вкладки Склад → 403 для Manager.

11. Заказы

РазделFranchiseFranchiseeManagerCashier (POS)
GET списокВсе ТТСвои ТТСвоя ТТСвоя ТТ
GET деталиВсеСвоиСвояСвоя
POST (создать)Да (POS)
POST itemsДа
DELETE itemsДа
POST payДа
POST completeДаДа
POST cancelДаСвоиСвояСвой
PATCH orderДаДа

Известный баг: все вкладки Заказы → 403 для Manager.

12. Расписание / Смены / Зарплата

РазделFranchiseFranchiseeManagerCashier
Шаблоны сменДаСвои ТТСвоя ТТ (read?)N/A
РасписаниеДаСвоиСвояN/A
Time trackingДаСвоиСвояСвои часы
Формулы зарплатыДаСвоиПо payroll.readN/A
ВедомостиДаСвоиПо payroll.readN/A
Активность сотрудниковДаСвоиСвоя ТТN/A

13. Aggregator integrations / PayKeeper / Marking

РазделFranchiseFranchiseeManagerCashier
Aggregator bindings на ТТДаСвои ТТСвоя ТТ (?)N/A
PayKeeper подключение к ЮЛПо integrations.manageСвоих ЮЛNoN/A

Чек-лист для тестера T1

После прогона матрицы заполнить отчёт:

RBAC Pass — RUN-{date}-{N}
- Прогнано ролей: 4 / 4
- Разделов: 13 / 13
- Расхождений с ожиданием: {N}
- Заведено новых багов: BUG-NNN, BUG-NNN
- Подтверждено известных RBAC-багов: BUG-NNN, ...

Методика прогона

  1. Подготовить 4 учётки (получить у тест-лида или создать через bootstrap):
    • franchise@test.local — Franchise owner главной франшизы (type=corporate)
    • franchisee@test.local — Franchisee owner с ≥1 ЮЛ и ≥2 ТТ
    • manager@test.local — Manager на 1 конкретной ТТ
    • cashier@test.local — Cashier с PIN на той же ТТ
  2. Подготовить отдельную тестовую франшизу с type=individual для проверки скрытия ЮЛ
  3. Прогон: открывать каждый раздел под каждой ролью, фиксировать в матрице факт
  4. Для каждого расхождения завести BUG-NNN с привязкой к ячейке матрицы и spec-источнику