# Spec Delta ## Purpose Дельта change `quality-metrics` (метрики качества первички). ## MODIFIED Requirements ### Requirement: Идемпотентный seed справочников продукта Команда `python -m scripts.seed` (из `api/`) SHALL загрузить из `api/seed/core/`: `regional_office` (Головной офис, `is_head_office = true`), `role` — 7 системных ролей ТЗ 8.1 (`KA_RF`, `KA_GO`, `RKA`, `CLIENT_MANAGER`, `CURATOR_GO`, `EXPERT`, `ADMIN`, `is_system = true`), `permission` — 17 сочетаний объект × действие из §10 правил с кодами `_` (`EXPORT` при совпадении), `role_permission` по матрице §10 (ASSUMPTION(OQ-16)), `chart_of_account`, `elimination_rule` + `elimination_rule_account` версии 1 для ББ (§4), `required_document_rule` для `BASIC` и `EXTENDED`. Записи SHALL вставляться или обновляться по натуральному ключу; удаление MUST NOT выполняться. Исключение — матрица `role_permission` (ей после первичной загрузки владеет администратор, issue #9): в ПУСТУЮ таблицу матрица файла SHALL загружаться целиком; в заполненную SHALL вставляться только пары, у которых роль или право вставлены этим же запуском seed (их администратор снять не мог), а остальные пары файла MUST NOT добавляться — право, снятое администратором, не возвращается, добавленное сверх файла не отзывается. Отчёт команды SHALL сообщать, что матрица пропущена (или сколько добавлено пар новых ролей и прав). Право `QUALITY_METRICS_VIEW` (объект `QUALITY_METRICS`, действие `VIEW`) SHALL выдаваться всем ролям; на стенде, где матрица уже заполнена, пара добавляется только как пара впервые созданного права — для появления пункта меню нужен повторный `make seed`. #### Scenario: Первый запуск на пустой схеме - **WHEN** после `alembic upgrade head` выполняется `python -m scripts.seed` - **THEN** в `role` 7 строк, в `permission` 17, в `role_permission` — число строк равно сумме прав по матрице §10, в `elimination_rule` 8 строк с `statement_type = balance`, `version_no = 1`, в `required_document_rule` для `BASIC` 10 строк (BALANCE, INCOME, OSV × 01, 58, 60, 62, 66, 67, 76, 90) и для `EXTENDED` 27 строк #### Scenario: Повторный запуск - **WHEN** `python -m scripts.seed` выполняется второй раз без изменения файлов - **THEN** число строк во всех затронутых таблицах не меняется, команда завершается с кодом 0, в отчёте `role_permission` помечена как пропущенная #### Scenario: Право, снятое администратором - **WHEN** администратор снял с роли `EXPERT` право `EX_VIEW`, после чего seed запущен снова - **THEN** связь `EXPERT × EX_VIEW` не восстановлена, остальная матрица не изменилась #### Scenario: Новые роль и право в файлах seed - **WHEN** матрица заполнена, а в `permissions.yaml` добавлено новое право, в `roles.yaml` — новая роль, и в `role_permissions.yaml` — их пары (новое право существующей роли, существующее право новой роли) - **THEN** seed вставляет ровно эти пары; снятые ранее администратором связи существующих ролей и прав не возвращаются #### Scenario: Администратор снял все связи - **WHEN** таблица `role_permission` пуста и seed запущен снова - **THEN** матрица файла загружается целиком, как при первом запуске #### Scenario: Изменение названия роли в файле - **WHEN** в `roles.yaml` изменено `name` роли `EXPERT` и seed запущен снова - **THEN** строка `role` с `code = EXPERT` обновлена, новая не создана #### Scenario: Право метрик на заполненной матрице - **WHEN** матрица заполнена, право `QUALITY_METRICS_VIEW` создаётся впервые и seed запущен - **THEN** добавлены пары права со всеми ролями; ранее снятые администратором связи не возвращены