From d2a02d76bd04ae2b5fb2f909ddc724f673cc8e27 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 13 Oct 2026 18:07:03 +0400 Subject: [PATCH] =?UTF-8?q?dev:=20=D1=87=D0=BB=D0=B5=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B0=20=D0=93=D0=A1=D0=9A/=D0=93=D0=A1=D0=97=20=D0=B2?= =?UTF-8?q?=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B5=20=D0=AE=D0=9B=20(arm-c?= =?UTF-8?q?ore=20#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `LegalEntityOut.memberships` — в журнале изменений гайда фронта, таблице справочников и контракте files-directories; убран совет брать членства из `related-groups/{id}` или карточки. Co-Authored-By: Claude Opus 5.5 --- dev/api-contract-files-directories.md | 7 +++---- dev/frontend-api-guide.md | 11 ++++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/dev/api-contract-files-directories.md b/dev/api-contract-files-directories.md index 1cab3d1..c9923b1 100644 --- a/dev/api-contract-files-directories.md +++ b/dev/api-contract-files-directories.md @@ -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` рядом остаются; неактивный diff --git a/dev/frontend-api-guide.md b/dev/frontend-api-guide.md index 5cb1cf8..178e405 100644 --- a/dev/frontend-api-guide.md +++ b/dev/frontend-api-guide.md @@ -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 Справочники: изменение