dev: членства ГСК/ГСЗ в списке ЮЛ (arm-core #109)

`LegalEntityOut.memberships` — в журнале изменений гайда фронта, таблице справочников и
контракте files-directories; убран совет брать членства из `related-groups/{id}` или карточки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-13 18:07:03 +04:00
parent 161f0d4f45
commit d2a02d76bd
2 changed files with 9 additions and 9 deletions

View File

@ -91,13 +91,13 @@ opening_debit?, opening_credit?, turnover_debit?, turnover_credit?, closing_debi
| `/company-groups/{company_group_id}/related-groups` | — | `RelatedGroupOut[]` (ГСК и ГСЗ; ГСК — `kind = gsk`) | выбор ГСК в [42], фильтр «ГСК» в [36] |
| `/related-groups/{group_id}` | — | `RelatedGroupDetail` (+ `members[]`) | отметки [42], колонка «ГСК» в [36] |
| `/legal-entities` | `company_group_id`, `outside_group` (bool), `inn` (точно), `q` (подстрока имени/ИНН), `closed` (bool), `limit`, `offset` | `Page[LegalEntityOut]` по имени | [36] «Показать все ЮЛ в ГК», список ЮЛ в [42], монозаёмщики [60] |
| `/legal-entities/{entity_id}` | — | `LegalEntityDetail` (+ `memberships[]`, `aliases[]`) | карточка ЮЛ |
| `/legal-entities/{entity_id}` | — | `LegalEntityDetail` (+ `aliases[]`; `memberships[]` — как в списке) | карточка ЮЛ |
**`CompanyGroupOut`** `{id, code, crm_id?, name, base_regional_office_id?, base_regional_office? {id, name, is_head_office}, is_archived, valid_from, legal_entities_count, created_at?,
updated_at?}`. **`RelatedGroupOut`** `{id, code, company_group_id, kind, name, created_date?, members_count}`;
**`RelatedGroupDetail`** — + `members[] {legal_entity_id, inn, name, valid_from}` (текущий состав). **`LegalEntityOut`** `{id, inn,
crm_id?, entity_type?, name, company_group_id?, regional_office_id?, regional_office? {id, name, is_head_office}, close_date?, valid_from, created_at?, updated_at?,
documents_count, outside_group, closed}` (`outside_group` — нет ГК, монозаёмщик; `closed` — заполнен `close_date`; оба вычисляет сервер); **`LegalEntityDetail`** — + `memberships[] {related_group_id, code, kind, name, valid_from}`, `aliases[] {id,
documents_count, memberships[] {related_group_id, code, kind, name, valid_from}, outside_group, closed}` (`outside_group` — нет ГК, монозаёмщик; `closed` — заполнен `close_date`; оба вычисляет сервер; `memberships` — текущие ГСК/ГСЗ, arm-core #109); **`LegalEntityDetail`** — + `aliases[] {id,
alias, normalized_alias, created_at?}`.
Нюансы:
@ -106,8 +106,7 @@ alias, normalized_alias, created_at?}`.
периметр — до 500 ЮЛ: дочитывайте страницы по `offset`, пока не наберёте `total`), отметки — члены
выбранной ГСК из `related-groups/{id}`; создание — `POST /consolidations` с `legal_entity_ids` (`dev/api-contract-slice-4.md`,
нюанс 19).
- **Колонка «ГСК» в [36]**: у `LegalEntityOut` членства нет — возьмите `related-groups/{id}` по каждой ГСК ГК (их немного) или
`LegalEntityDetail.memberships`.
- **Колонка «ГСК» и фильтр по ГСК/ГСЗ в [36]**: `memberships` строк `legal-entities?company_group_id=<ГК>` (arm-core #109).
- **Монозаёмщики [60]**: `legal-entities?outside_group=true`; «Документы» — `documents_count`, статусы ОФР/ББ/ОСВ — из
`GET /legal-entities/{id}/files` по ЮЛ (сводного поля нет; экран не отнесён к срезу, П-6).
- Филиал (`base_regional_office` у ГК, `regional_office` у ЮЛ и в истории) приходит объектом с именем, `*_id` рядом остаются; неактивный

View File

@ -23,12 +23,13 @@
---
## 1. Что изменилось за последние дни (05–09.10.2026)
## 1. Что изменилось за последние дни (05–13.10.2026)
Если клиент писался по более ранним контрактам, пройдитесь по этому списку.
| Когда, PR | Что изменилось в API | Что сделать в клиенте |
|---|---|---|
| 13.10, arm-core #110 (#109) | **Членства ГСК/ГСЗ в списке ЮЛ.** `memberships[] {related_group_id, code, kind, name, valid_from}` перенесено из `LegalEntityDetail` в `LegalEntityOut`: приходит в `GET /directories/legal-entities`, в ответах `move`/`withdraw` (после них — `[]`) и, как раньше, в карточке. Только текущие членства; нет — `[]`. Серверного фильтра по ГСК/ГСЗ нет | карточка ГК [36] и модалка [42]: колонка «ГСК»/«ГСЗ» и фильтр по ним — из `memberships` строк списка, без `related-groups/{id}` и без карточки каждого ЮЛ |
| 09.10, docs #90 (DBML v5.18; arm-core и arm-web — дочерние PR) | **Файлы в контексте консолидации.** Новые маршруты `POST /consolidations/{cid}/legal-entities/{le}/files` (загрузка в консоль: 404; 409 `CONSOLIDATION_NOT_EDITABLE` — нет версии «в работе»; 422 `ENTITY_NOT_IN_PERIMETER`) и `GET /consolidations/{cid}/legal-entities/{le}/files` (рабочий стол консоли для ЮЛ: файлы консоли + файлы с документами, привязанными к её версиям; `include_superseded`). Query `consolidation_version_id` у `POST /legal-entities/{id}/files` **удалён**; `FileOut.consolidation_id: uuid \| null`. Отменяет решение 07.10 «фильтра файлов ЮЛ в контексте версии нет» | панель [39] — стол консоли (`current_consolidation_id` из `ConsolidationPeriodOut.consolidation_id` строки списка / карточки версии `consolidation_id`), переключатель «Все документы организации» → `GET /legal-entities/{id}/files` с подписью консолидации у файла; загрузка [40] — новым маршрутом, кнопка недоступна, если версия не «в работе» |
| 09.10, arm-core #85 (#84) | **Форма ЮЛ одним запросом** (макет [51-02], [79]): `POST` и `PATCH /directories/legal-entities` принимают `aliases: string[]` (1–500 символов, ≤ 100), `gsk_id`, `gsz_id` и применяют их в той же транзакции, что и поля ЮЛ (ошибка — откат всего). `POST`: алиасы и членства создаются вместе с ЮЛ. `PATCH`: не переданное поле не меняется; `aliases` — **итоговый набор** (сверка по `normalized_alias`: совпавшие не трогаются, лишние удаляются — нужно право `DIRECTORY_DELETE`, иначе 403 строкой; `aliases: null` — 422), `gsk_id`/`gsz_id` — итоговая группа (`null` — выйти, другая — сменить). Новый код 422 `WRONG_GROUP_KIND`; дубль в списке — 409 `ALIAS_EXISTS`. Ответ обоих — **`LegalEntityDetail`** (было `LegalEntityOut`; поля прежние + `memberships`, `aliases`) | «Добавить»/«Сохранить» в модалках ЮЛ — один запрос со всей формой; в `PATCH` слать `aliases` и группы целиком, как они на экране; после ответа брать карточку из него, без `GET`; удаление тега-алиаса без `DIRECTORY_DELETE` (`/me.permissions`) не предлагать — сервер ответит 403 |
| 08.10, arm-core #75 (#74) | **Отмена П-1** (решение владельца 08.10.2026): «несопоставленная» строка свода — нет ЮЛ после резолва **и** нет ИНН из файла. `unmapped_total`, `GET …/osv?unmapped=true` и экспорт с этим фильтром больше не включают строки с ИНН, которого нет в справочнике (`unmapped=false` — все остальные строки). Новое поле `ConsolidatedRowOut.counterparty_entity_inn` — ИНН сопоставленного ЮЛ справочника (П-8; `counterparty_inn` — по-прежнему ИНН из файла) | «Указать» — только у строк без `counterparty_id` и без `counterparty_inn`; у строки, сопоставленной без ИНН в файле, показывать `counterparty_entity_inn` с возможностью пересопоставить (макет [32-osv-no-inn], `osv-inn-mapped-button`; повторный `POST …/counterparty` разрешён) |
@ -261,8 +262,8 @@ UI прячет элементы по `GET /me → permissions` (объедин
| `GET /directories/company-groups/{group_id}/history` | — | `CompanyGroupHistoryOut[]` (прошлые снимки, новые первыми) |
| `GET /directories/company-groups/{company_group_id}/related-groups` | — | `RelatedGroupOut[]` — ГСК и ГСЗ ГК (`kind`), по имени, с `members_count` |
| `GET /directories/related-groups/{group_id}` | — | `RelatedGroupDetail` (+ `members[] {legal_entity_id, inn, name, valid_from}` — текущий состав) |
| `GET /directories/legal-entities` | `company_group_id`, `outside_group` (монозаёмщики), `inn` (точно), `q` (подстрока имени / ИНН / КПП), `closed`, `limit`, `offset` | `Page[LegalEntityOut]` |
| `GET /directories/legal-entities/{entity_id}` | — | `LegalEntityDetail` (+ `memberships[]` в ГСК/ГСЗ, `aliases[]`) |
| `GET /directories/legal-entities` | `company_group_id`, `outside_group` (монозаёмщики), `inn` (точно), `q` (подстрока имени / ИНН / КПП), `closed`, `limit`, `offset` | `Page[LegalEntityOut]` (с `memberships[]` — текущие ГСК/ГСЗ) |
| `GET /directories/legal-entities/{entity_id}` | — | `LegalEntityDetail` (+ `aliases[]`) |
| `GET /directories/legal-entities/{entity_id}/history` | — | `LegalEntityHistoryOut[]` (снимки с `event_type` и `effective_date`, новые первыми) |
Нюансы:
@ -272,8 +273,8 @@ UI прячет элементы по `GET /me → permissions` (объедин
`GET /directories/regional-offices` нужен только для выпадающих списков выбора филиала.
- `LegalEntityOut.outside_group` = нет ГК (монозаёмщик); `closed` = заполнен `close_date`. Оба вычисляются сервером.
- `documents_count` у ЮЛ — число **документов** (не файлов) его незаменённых файлов: файл с ББ и ОФР даёт 2.
- Членства ЮЛ в ГСК в `LegalEntityOut` нет: для колонки «ГСК» в списке берите `related-groups/{id}` каждой ГСК ГК (их немного)
или `LegalEntityDetail.memberships`.
- `memberships` у ЮЛ — текущие членства в ГСК/ГСЗ (`kind`: `gsk` / `gsz`), во всех ответах ЮЛ, включая список: колонку «ГСК»
и фильтр по ГСК/ГСЗ стройте по ним. Серверного фильтра по ГСК/ГСЗ нет — фильтруйте страницу ЮЛ на клиенте.
- Поиска ГК по имени филиала нет.
### 5.3 Справочники: изменение