# directory-policy Specification ## Purpose Политика видимости справочников поверх прав: что именно из ГК/ЮЛ/ГСК видит пользователь, определяется данными о его филиале, а не кодом роли (§10.1 `05-domain-rules.md`). ## Requirements ### Requirement: Область видимости вычисляется из филиала пользователя Для каждого запроса ядро SHALL вычислять область видимости из `Principal`: если `regional_office.is_head_office = true` — вся система; иначе — ГК с `company_group.base_regional_office_id = app_user.regional_office_id`, их ЮЛ и ГСК/ГСЗ, а также монозаёмщики с `legal_entity.regional_office_id = app_user.regional_office_id`. Код роли (`role.code`) MUST NOT участвовать в вычислении; `business_segment` в Срезе 1 не используется (ASSUMPTION(OQ-86)). #### Scenario: Пользователь филиала видит только своё - **WHEN** есть ГК А (филиал X) и ГК Б (филиал Y), пользователь `KA_RF` филиала X запрашивает список ГК - **THEN** в ответе только ГК А, `total = 1` #### Scenario: Пользователь ГО видит всё - **WHEN** пользователь с `is_head_office = true` запрашивает список ГК - **THEN** в ответе обе ГК ### Requirement: Объект вне видимости неотличим от несуществующего Чтение, изменение и любые операции над ГК/ЮЛ/ГСК вне области видимости SHALL возвращать 404 с тем же телом, что и для несуществующего идентификатора; 403 для этого случая MUST NOT использоваться. #### Scenario: Чужая ГК по id - **WHEN** пользователь филиала X запрашивает `GET /directories/company-groups/{id}` ГК Б - **THEN** ответ 404, текст совпадает с ответом на случайный `uuid` ### Requirement: Политика применяется до прав на изменение Проверка права (`require`) и проверка видимости SHALL выполняться обе; порядок: право → видимость → операция. Создание ГК пользователем филиала SHALL привязывать её к его филиалу, если `base_regional_office_id` не указан; указание чужого филиала пользователем филиала → 422 `OFFICE_NOT_ALLOWED`. #### Scenario: Создание ГК из филиала - **WHEN** пользователь филиала X с `DIRECTORY_EDIT` создаёт ГК без филиала - **THEN** у ГК `base_regional_office_id` = X, и она видна создателю