added company group table #31

Merged
aep merged 13 commits from feat/legalEntities into test 2026-10-19 10:35:19 +03:00
Owner
No description provided.
grog added 6 commits 2026-10-15 16:17:41 +03:00
grog requested review from aep 2026-10-15 16:17:42 +03:00
grog requested review from maxim 2026-10-15 16:17:42 +03:00
aep added 2 commits 2026-10-15 17:28:58 +03:00
После merge test (ESLint + Prettier, #30): npm run format и правки,
без которых make check и синхронизация arm-core/web не проходят.

- Список ЮЛ: тип ответа — страница Page<ICatalogueJur> (items/total),
  thunk с rejectValue: string, как в companyGroupsSlice.
- Склонения «организация/запись» — общая функция pluralRu в utils/labels
  (с тестом) вместо вложенных тернарников; заодно верно для 11–14, 21–24.
- Список ГК: пункт — <button> вместо div с onClick (a11y), пустое
  состояние и загрузка — без вложенного тернарника.
- Убраны лишние async, неиспользуемые импорты и проп companyId,
  any в колонке «Основной РФ».

make check: tsc 0, biome 7 предупреждений (как на test), eslint 0 ошибок,
vitest 141/141, build ок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner

Ревью PR #31 (AURORA-1410)

Форматирование, make check и слияние с test мы сделали в этой ветке — коммиты 2cddb55 (после merge PR #30 с ESLint + Prettier), b1b9d21 и 5b13b74:

  • влит свежий test (последний раз — b1b9d21; конфликт в utils/labels решён: оставлены pluralRu и подписи статуса строки и уровня замечания из test), прогнан npm run format;
  • npm run format после твоих правок (5b13b74: порядок импортов в CompanyGroupsList.tsx, Prettier в пяти файлах);
  • исправлены ошибки tsc/ESLint/biome: тип ответа списка ЮЛ — Page<ICatalogueJur>; склонения — функция pluralRu в utils/labels вместо вложенных тернарников (заодно верно для 11–14, 21–24); пункт списка ГК — <button>; убраны лишние async и импорты.

make check зелёный: tsc 0, eslint 0 ошибок (19 предупреждений), vitest 324/324, build ок. Переформатирование общих файлов (client.ts, App.tsx, store.ts) ушло само. Перед продолжением сделай git pull, дальше перед каждым push — npm run format и make check.

PR можно сливать. Оставшиеся замечания ниже merge не блокируют — они заведены техническим долгом в AURORA-1671 (приоритет «Высокий»: п. 1 снимает членство ЮЛ в ГСК/ГСЗ при обычном «Изменить ЮЛ»).

Техдолг — AURORA-1671

  1. «Изменить ЮЛ» выводит ЮЛ из ГСК/ГСЗ без действия пользователя. Эффект по company_group_id (CatalogueJurForm.tsx, useEffect с form.setFieldsValue({ gsk_id: undefined, gsz_id: undefined })) срабатывает и после загрузки карточки в getInitialData: useWatch видит, что ГК появилась, и стирает только что подставленные gsk_id/gsz_id. При сохранении они уходят null — членство в ГСК/ГСЗ снимается. Сбрасывать ГСК/ГСЗ только при смене ГК пользователем — в onChange у поля «ГК», не в эффекте.
  2. Дата создания ГСК/ГСЗ в «Изменить»: пустая дата подставляется сегодняшней (RelatedGroupForm.tsx, created_date: data?.created_date ?? dayjs()…) и при «Сохранить» записывается — дата меняется, хотя пользователь её не трогал. Подставлять сегодняшнюю можно только при создании; при изменении — как в карточке, пусто.
  3. ИНН и КПП: КПП приводить к верхнему регистру (normalize); ошибки сервера INVALID_INN / INVALID_KPP / INN_EXISTS показывать у поля через form.setFields, а не только уведомлением.
  4. Очистка полей при изменении: в «Изменить ГСК/ГСЗ» пустой crm_id, в «Изменить ЮЛ» пустой kpp отправлять как null — «очистить» для сервера означает только null. Сейчас crm_id группы передаётся как есть (пустое поле не уходит или уходит пустой строкой, а «не передано» = «не менять»), очищенный КПП уходит пустой строкой, которую сервер проверяет как КПП.
  5. Список ЮЛ — все страницы. Сейчас запрос limit=200, offset=0 — ЮЛ после 200-го не показываются. Дочитывать страницы, пока не получен total, так же, как fetchAllLegalEntities в company_groups.ts.
  6. Поле «ГК» в формах создания ЮЛ, ГСК и ГСЗ при открытии из карточки заполнять выбранной ГК — пользователь видит, в какую ГК заводит запись. Сейчас оно пустое: ЮЛ без выбора молча становится монозаёмщиком, у ГСК/ГСЗ ГК приходится выбирать заново. При изменении — как сейчас: текущая ГК, поле недоступно.
  7. Фильтр по ГСК сбрасывать при смене ГК — сейчас у следующей ГК 0 строк с плашкой «Фильтр по: GSK-…».
  8. Ошибки загрузки не-ApiError (сеть, таймаут) сейчас глотаются молча: в catch нужен общий текст уведомления для любой ошибки.
  9. CRM ID ГСК/ГСЗ в списке (AURORA-1619): ядро с DBML v5.19 (arm-core main) сохраняет crm_id группы и отдаёт его и в карточке, и в списке GET …/company-groups/{id}/related-groups. В RelatedGroupOut добавить crm_id: string | null, в RelatedGroupTable — колонку «ID в CRM» (и в поиск по таблице). Занятый CRM ID — 409 CRM_ID_EXISTS: показывать у поля через form.setFields.
  10. Подсказка «Генерируется автоматически» у полей CRM ID в формах ГСК/ГСЗ и ГК — убрать: CRM ID вводится вручную, сервер назначает только внутренние коды GK-… / GSK-… / GSZ-….

Желательно

  • ГСК без даты создания в таблице показывает «01.01.1970» (RelatedGroupTable/config.tsx): — при null, формат через dayjs.
  • Тексты: CataloguGroupTabs; «Базовый РФ ГК» в форме ЮЛ; подпись поиска «по ГК, CRM ID или РФ» в таблице ЮЛ (ищет по ИНН/КПП/имени); «заемщиков» в форме и «заёмщиков» в окне удаления — писать одинаково; &nbsp; в плашке фильтра заменить отступом.
  • useVirtualList: высота контейнера зашита (containerHeight: 900) — при другой высоте окна список дорисовывается не полностью; брать высоту из ref (ResizeObserver).
  • dayjs добавить в зависимости (^1.11.11), сейчас приходит транзитивно от antd.
  • loadOffices перенести из Admin/UsersTable.tsx в services/api/directories/; не импортировать store в RelatedGroupTable/config.tsx.
  • Типы catalogueJur.ts: даты — строки, closed: boolean, aliases: string[], entity_type допускает null.
  • ESLint предупреждает о неполных зависимостях useEffect в новых формах (19 предупреждений против 9 на test) — при быстром переключении ГК ответ от прошлой ГК может прийти последним.

Объём задачи

Что из AURORA-1410 не вошло в этот PR (изменение и архив ГК, импорт из ЕЦП [38], «История изменений» с фильтром, признаки «входит в ГСК/ГСЗ» в таблице ЮЛ, вопрос про «Редактировать состав» ГСК, загрузка реестра «ЮЛ вне ГК»), вынесено техдолгом в AURORA-1636, в этом PR это делать не нужно. AURORA-1410 закрываем по этому PR; доработки после ревью — AURORA-1671. Добавь, пожалуйста, в описание PR короткий список сделанного и ссылку на AURORA-1636. Подписи окна «Вывести из состава ГК» и пункт меню на странице «ЮЛ вне ГК» обсудим в AURORA-1630.

## Ревью PR #31 (AURORA-1410) **Форматирование, `make check` и слияние с `test` мы сделали в этой ветке** — коммиты `2cddb55` (после merge PR #30 с ESLint + Prettier), `b1b9d21` и `5b13b74`: - влит свежий `test` (последний раз — `b1b9d21`; конфликт в `utils/labels` решён: оставлены `pluralRu` и подписи статуса строки и уровня замечания из `test`), прогнан `npm run format`; - `npm run format` после твоих правок (`5b13b74`: порядок импортов в `CompanyGroupsList.tsx`, Prettier в пяти файлах); - исправлены ошибки tsc/ESLint/biome: тип ответа списка ЮЛ — `Page<ICatalogueJur>`; склонения — функция `pluralRu` в `utils/labels` вместо вложенных тернарников (заодно верно для 11–14, 21–24); пункт списка ГК — `<button>`; убраны лишние `async` и импорты. `make check` зелёный: tsc 0, eslint 0 ошибок (19 предупреждений), vitest 324/324, build ок. Переформатирование общих файлов (`client.ts`, `App.tsx`, `store.ts`) ушло само. **Перед продолжением сделай `git pull`**, дальше перед каждым push — `npm run format` и `make check`. PR можно сливать. Оставшиеся замечания ниже merge не блокируют — они заведены техническим долгом в **AURORA-1671** (приоритет «Высокий»: п. 1 снимает членство ЮЛ в ГСК/ГСЗ при обычном «Изменить ЮЛ»). ### Техдолг — AURORA-1671 1. **«Изменить ЮЛ» выводит ЮЛ из ГСК/ГСЗ без действия пользователя.** Эффект по `company_group_id` (`CatalogueJurForm.tsx`, `useEffect` с `form.setFieldsValue({ gsk_id: undefined, gsz_id: undefined })`) срабатывает и после загрузки карточки в `getInitialData`: `useWatch` видит, что ГК появилась, и стирает только что подставленные `gsk_id`/`gsz_id`. При сохранении они уходят `null` — членство в ГСК/ГСЗ снимается. Сбрасывать ГСК/ГСЗ только при смене ГК пользователем — в `onChange` у поля «ГК», не в эффекте. 2. **Дата создания ГСК/ГСЗ в «Изменить»**: пустая дата подставляется сегодняшней (`RelatedGroupForm.tsx`, `created_date: data?.created_date ?? dayjs()…`) и при «Сохранить» записывается — дата меняется, хотя пользователь её не трогал. Подставлять сегодняшнюю можно только при создании; при изменении — как в карточке, пусто. 3. **ИНН и КПП**: КПП приводить к верхнему регистру (`normalize`); ошибки сервера `INVALID_INN` / `INVALID_KPP` / `INN_EXISTS` показывать у поля через `form.setFields`, а не только уведомлением. 4. **Очистка полей при изменении**: в «Изменить ГСК/ГСЗ» пустой `crm_id`, в «Изменить ЮЛ» пустой `kpp` отправлять как `null` — «очистить» для сервера означает только `null`. Сейчас `crm_id` группы передаётся как есть (пустое поле не уходит или уходит пустой строкой, а «не передано» = «не менять»), очищенный КПП уходит пустой строкой, которую сервер проверяет как КПП. 5. **Список ЮЛ — все страницы.** Сейчас запрос `limit=200, offset=0` — ЮЛ после 200-го не показываются. Дочитывать страницы, пока не получен `total`, так же, как `fetchAllLegalEntities` в `company_groups.ts`. 6. **Поле «ГК» в формах создания ЮЛ, ГСК и ГСЗ** при открытии из карточки заполнять выбранной ГК — пользователь видит, в какую ГК заводит запись. Сейчас оно пустое: ЮЛ без выбора молча становится монозаёмщиком, у ГСК/ГСЗ ГК приходится выбирать заново. При изменении — как сейчас: текущая ГК, поле недоступно. 7. **Фильтр по ГСК сбрасывать при смене ГК** — сейчас у следующей ГК 0 строк с плашкой «Фильтр по: GSK-…». 8. **Ошибки загрузки не-`ApiError`** (сеть, таймаут) сейчас глотаются молча: в `catch` нужен общий текст уведомления для любой ошибки. 9. **CRM ID ГСК/ГСЗ в списке** (AURORA-1619): ядро с DBML v5.19 (arm-core main) сохраняет `crm_id` группы и отдаёт его и в карточке, и в списке `GET …/company-groups/{id}/related-groups`. В `RelatedGroupOut` добавить `crm_id: string | null`, в `RelatedGroupTable` — колонку «ID в CRM» (и в поиск по таблице). Занятый CRM ID — 409 `CRM_ID_EXISTS`: показывать у поля через `form.setFields`. 10. **Подсказка «Генерируется автоматически» у полей CRM ID** в формах ГСК/ГСЗ и ГК — убрать: CRM ID вводится вручную, сервер назначает только внутренние коды `GK-…` / `GSK-…` / `GSZ-…`. ### Желательно - ГСК без даты создания в таблице показывает «01.01.1970» (`RelatedGroupTable/config.tsx`): `—` при `null`, формат через dayjs. - Тексты: `CataloguGroupTabs`; «Базовый РФ ГК» в форме ЮЛ; подпись поиска «по ГК, CRM ID или РФ» в таблице ЮЛ (ищет по ИНН/КПП/имени); «заемщиков» в форме и «заёмщиков» в окне удаления — писать одинаково; `&nbsp;` в плашке фильтра заменить отступом. - `useVirtualList`: высота контейнера зашита (`containerHeight: 900`) — при другой высоте окна список дорисовывается не полностью; брать высоту из `ref` (ResizeObserver). - `dayjs` добавить в зависимости (`^1.11.11`), сейчас приходит транзитивно от antd. - `loadOffices` перенести из `Admin/UsersTable.tsx` в `services/api/directories/`; не импортировать `store` в `RelatedGroupTable/config.tsx`. - Типы `catalogueJur.ts`: даты — строки, `closed: boolean`, `aliases: string[]`, `entity_type` допускает `null`. - ESLint предупреждает о неполных зависимостях `useEffect` в новых формах (19 предупреждений против 9 на `test`) — при быстром переключении ГК ответ от прошлой ГК может прийти последним. ### Объём задачи Что из AURORA-1410 не вошло в этот PR (изменение и архив ГК, импорт из ЕЦП [38], «История изменений» с фильтром, признаки «входит в ГСК/ГСЗ» в таблице ЮЛ, вопрос про «Редактировать состав» ГСК, загрузка реестра «ЮЛ вне ГК»), вынесено техдолгом в **AURORA-1636**, в этом PR это делать не нужно. AURORA-1410 закрываем по этому PR; доработки после ревью — AURORA-1671. Добавь, пожалуйста, в описание PR короткий список сделанного и ссылку на AURORA-1636. Подписи окна «Вывести из состава ГК» и пункт меню на странице «ЮЛ вне ГК» обсудим в AURORA-1630.
aep added 1 commit 2026-10-19 09:28:34 +03:00
Конфликт в utils/labels: оставлены обе стороны — pluralRu ветки и
lineStatusLabel/severityLabel из test (контракт 2.0). make check зелёный:
eslint 0 ошибок (18 предупреждений, как до слияния), vitest 324/324, build ок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
grog added 2 commits 2026-10-19 09:33:42 +03:00
grog added 1 commit 2026-10-19 09:44:39 +03:00
Author
Owner
  • Добавлена таблица юридических лиц, гск и гсз
  • Добавлены форма создания и редактирования юл, гк, гск, гсз
  • Добавлен виртуализированный список гк с фильтром
  • Добавлены формы перемещения и вывода юл из гк
- Добавлена таблица юридических лиц, гск и гсз - Добавлены форма создания и редактирования юл, гк, гск, гсз - Добавлен виртуализированный список гк с фильтром - Добавлены формы перемещения и вывода юл из гк
aep added 1 commit 2026-10-19 10:27:15 +03:00
npm run format: порядок импортов (biome) в CompanyGroupsList.tsx, Prettier в
пяти файлах; правки только оформления. make check: eslint 0 ошибок
(19 предупреждений), vitest 324/324, build ок.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 8345f5e756 into test 2026-10-19 10:35:19 +03:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-web#31
No description provided.