Список ЮЛ: текущие членства ГСК/ГСЗ в LegalEntityOut (#109) #110

Merged
aep merged 1 commits from feat/109-le-list-memberships into main 2026-10-13 17:58:24 +03:00
Owner

Closes #109

Что сделано

  • memberships: list[MembershipOut] перенесено из LegalEntityDetail в LegalEntityOut — поле приходит в GET /directories/legal-entities, в ответах move/withdraw (после них — [], членства закрываются) и, как раньше, в карточке (GET …/{id}, POST, PATCH). Формат прежний: {related_group_id, code, kind, name, valid_from}, только текущие, по виду и коду группы.
  • repositories/directories.current_memberships(entity_id) → current_memberships_by_entities(ids): членства набора ЮЛ одним запросом; LegalEntityService.memberships_by_entities — общее для to_outs и карточки.
  • Спека openspec/specs/directories-api (bounded-задача, без change): требование и сценарий «Членства в списке».
  • Тесты tests/test_api_le_list_memberships.py: членства в списке (ГСК+ГСЗ, только ГСЗ, закрытое не отдаётся), [] в move/withdraw, без N+1 (число SQL не растёт с 2 до 14 ЮЛ, один SELECT по related_group_member).

Зачем: карточка ГК (управление справочниками) фильтрует ЮЛ по ГСК/ГСЗ — раньше для этого нужна была карточка каждого ЮЛ.

Rulings I made

  • R-1: серверный фильтр related_group_id в списке ЮЛ не добавлен — решение владельца в чате 13.10.2026 («пока фильтр не нужен»).
  • R-2: memberships отдаётся во всех ответах LegalEntityOut (в т. ч. move/withdraw), а не только в списке — одна схема, батч в общем to_outs; дизайн согласован в чате.

Находки

Нет (bounded, самопроверка диффа; ORM LegalEntity не имеет атрибута memberships — конфликта с from_attributes нет).

Документация

Дочерний PR в RSHB/arm-ka-docs: dev/frontend-api-guide.md (журнал §1, таблица §5.2, нюанс), dev/api-contract-files-directories.md.

make check-full

ruff check / format: All checks passed!, 257 files already formatted
mypy: Success: no issues found in 147 source files
pytest -m "not integration": 1335 passed, 909 deselected
dbml-check, check-infra: OK
pytest -m "integration and not e2e": 908 passed, 1336 deselected in 360.05s
pytest -m e2e: 1 passed
docker-build: naming to docker.io/library/arm-core:latest done
web-check: biome — 140 files, 7 warnings (прежние), tsc — OK, build — ready
exit=0

🤖 Generated with Claude Code

Closes #109 ## Что сделано - `memberships: list[MembershipOut]` перенесено из `LegalEntityDetail` в `LegalEntityOut` — поле приходит в `GET /directories/legal-entities`, в ответах `move`/`withdraw` (после них — `[]`, членства закрываются) и, как раньше, в карточке (`GET …/{id}`, `POST`, `PATCH`). Формат прежний: `{related_group_id, code, kind, name, valid_from}`, только текущие, по виду и коду группы. - `repositories/directories.current_memberships(entity_id)` → `current_memberships_by_entities(ids)`: членства набора ЮЛ одним запросом; `LegalEntityService.memberships_by_entities` — общее для `to_outs` и карточки. - Спека `openspec/specs/directories-api` (bounded-задача, без change): требование и сценарий «Членства в списке». - Тесты `tests/test_api_le_list_memberships.py`: членства в списке (ГСК+ГСЗ, только ГСЗ, закрытое не отдаётся), `[]` в `move`/`withdraw`, без N+1 (число SQL не растёт с 2 до 14 ЮЛ, один SELECT по `related_group_member`). Зачем: карточка ГК (управление справочниками) фильтрует ЮЛ по ГСК/ГСЗ — раньше для этого нужна была карточка каждого ЮЛ. ## Rulings I made - R-1: серверный фильтр `related_group_id` в списке ЮЛ не добавлен — решение владельца в чате 13.10.2026 («пока фильтр не нужен»). - R-2: `memberships` отдаётся во всех ответах `LegalEntityOut` (в т. ч. `move`/`withdraw`), а не только в списке — одна схема, батч в общем `to_outs`; дизайн согласован в чате. ## Находки Нет (bounded, самопроверка диффа; ORM `LegalEntity` не имеет атрибута `memberships` — конфликта с `from_attributes` нет). ## Документация Дочерний PR в `RSHB/arm-ka-docs`: `dev/frontend-api-guide.md` (журнал §1, таблица §5.2, нюанс), `dev/api-contract-files-directories.md`. ## make check-full ``` ruff check / format: All checks passed!, 257 files already formatted mypy: Success: no issues found in 147 source files pytest -m "not integration": 1335 passed, 909 deselected dbml-check, check-infra: OK pytest -m "integration and not e2e": 908 passed, 1336 deselected in 360.05s pytest -m e2e: 1 passed docker-build: naming to docker.io/library/arm-core:latest done web-check: biome — 140 files, 7 warnings (прежние), tsc — OK, build — ready exit=0 ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-13 17:06:55 +03:00
`memberships` перенесено из `LegalEntityDetail` в `LegalEntityOut`: поле приходит в списке
`GET /directories/legal-entities`, в ответах `move`/`withdraw` (после них — `[]`) и, как раньше,
в карточке. Членства набора ЮЛ читаются одним запросом
(`current_memberships_by_entities`), без N+1. Нужно карточке ГК для фильтра ЮЛ по ГСК/ГСЗ.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit f5ddba7005 into main 2026-10-13 17:58:24 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#110
No description provided.