КПП юридического лица: legal_entity.kpp, миграция 0005, API, импорт (DBML v5.17, #45) #52

Merged
aep merged 2 commits from feat/45-kpp into main 2026-10-07 18:14:33 +03:00
Owner

Closes #45

Сливать после PR docs#53 (RSHB/arm-ka-docs#54) — ORM сверяется с ../docs/model/data-model-v5.17.dbml.

Что сделано

  • legal_entity.kpp, legal_entity_history.kpp (nullable, последней колонкой), миграция 0005_dbml_v5_17 (upgrade/downgrade, тест test_migrations.py).
  • domain/kpp.py: 9 символов (4 цифры, 2 цифры/латинские A-Z, 3 цифры), нормализация (пробелы, верхний регистр); у ИП запрещён; ошибка — 422 INVALID_KPP.
  • Схемы Create/Update/Out/Detail/HistoryOut; PATCH: kpp — снимок legal_entity_history(UPDATE) и аудит before/after с kpp; null очищает, не переданное не трогается; создание пишет kpp в after_value.
  • Поиск: q ищет и по КПП.
  • Импорт: необязательная колонка КПП (синоним kpp — словарь HEADER_SYNONYMS), код INVALID_KPP, update обновляет непустой КПП.
  • Dev-seed: необязательный ключ kpp; значений в данных нет (в ЕЦП-выгрузке и fixtures КПП ЮЛ seed нет) — не выдумывал.
  • Сверка DBML, Makefile, README, CLAUDE.md, openspec/config.yaml — v5.17.

Проверки

make check-full зелёный (ruff, mypy, 1238 unit, integration, dbml-check, check-infra, e2e, docker-build, web-check).

Rulings I made

  • R-1: порядок проверок в импорте: тип -> ИНН -> КПП -> дубль (парно docs#54 §13.2); неверный формат КПП у ЮЛ тоже INVALID_KPP и пропуск строки.
  • R-2: импорт update: непустой КПП из файла обновляет kpp, пустая ячейка не стирает; skip не меняет.
  • R-3: q ищет по КПП (подстрока), точный фильтр inn не менялся.
  • R-4: в аудите создания after_value всегда содержит ключ kpp (None, если не задан).
  • R-5: seed принимает kpp, но значений не задаёт; seed ранее записанный КПП не стирает.
  • R-6: спеки openspec/specs/directories-api, directory-import не менялись (bounded без change) — deferred, см. ниже.

Deferred

  • O-1: обновить openspec/specs/directories-api и directory-import (КПП, INVALID_KPP) отдельным change или при следующем архиве.
  • O-2: конфликт слияния с arm-core#47 (regional_office в тех же LegalEntityOut/LegalEntityHistoryOut) ожидаем.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3

Closes #45 **Сливать после PR docs#53 (RSHB/arm-ka-docs#54)** — ORM сверяется с `../docs/model/data-model-v5.17.dbml`. ## Что сделано - `legal_entity.kpp`, `legal_entity_history.kpp` (nullable, последней колонкой), миграция `0005_dbml_v5_17` (upgrade/downgrade, тест `test_migrations.py`). - `domain/kpp.py`: 9 символов (4 цифры, 2 цифры/латинские A-Z, 3 цифры), нормализация (пробелы, верхний регистр); у ИП запрещён; ошибка — 422 `INVALID_KPP`. - Схемы Create/Update/Out/Detail/HistoryOut; PATCH: `kpp` — снимок `legal_entity_history(UPDATE)` и аудит `before/after` с `kpp`; `null` очищает, не переданное не трогается; создание пишет `kpp` в `after_value`. - Поиск: `q` ищет и по КПП. - Импорт: необязательная колонка `КПП` (синоним `kpp` — словарь `HEADER_SYNONYMS`), код `INVALID_KPP`, `update` обновляет непустой КПП. - Dev-seed: необязательный ключ `kpp`; значений в данных нет (в ЕЦП-выгрузке и fixtures КПП ЮЛ seed нет) — не выдумывал. - Сверка DBML, Makefile, README, CLAUDE.md, openspec/config.yaml — v5.17. ## Проверки `make check-full` зелёный (ruff, mypy, 1238 unit, integration, dbml-check, check-infra, e2e, docker-build, web-check). ## Rulings I made - R-1: порядок проверок в импорте: тип -> ИНН -> КПП -> дубль (парно docs#54 §13.2); неверный формат КПП у ЮЛ тоже `INVALID_KPP` и пропуск строки. - R-2: импорт `update`: непустой КПП из файла обновляет `kpp`, пустая ячейка не стирает; `skip` не меняет. - R-3: `q` ищет по КПП (подстрока), точный фильтр `inn` не менялся. - R-4: в аудите создания `after_value` всегда содержит ключ `kpp` (None, если не задан). - R-5: seed принимает `kpp`, но значений не задаёт; seed ранее записанный КПП не стирает. - R-6: спеки `openspec/specs/directories-api`, `directory-import` не менялись (bounded без change) — deferred, см. ниже. ## Deferred - O-1: обновить `openspec/specs/directories-api` и `directory-import` (КПП, `INVALID_KPP`) отдельным change или при следующем архиве. - O-2: конфликт слияния с arm-core#47 (`regional_office` в тех же `LegalEntityOut`/`LegalEntityHistoryOut`) ожидаем. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
aep added 1 commit 2026-10-07 17:52:15 +03:00
- модели LegalEntity.kpp / LegalEntityHistory.kpp (последней колонкой), миграция 0005_dbml_v5_17 (upgrade/downgrade);
- domain/kpp.py: 9 символов (4 цифры, 2 цифры/латинские A-Z, 3 цифры), у ИП запрещён, иначе 422 INVALID_KPP;
- схемы Create/Update/Out/Detail/HistoryOut, PATCH пишет снимок history и аудит before/after с kpp, поиск q по КПП;
- импорт справочника: необязательная колонка КПП (синоним kpp), код INVALID_KPP, update обновляет непустой КПП;
- dev-seed: необязательный ключ kpp (значений в данных нет, не выдумываем);
- сверка с DBML, Makefile, README, CLAUDE.md, openspec/config.yaml — на v5.17.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
Author
Owner

В ветку влит main после #51 (Основной РФ объектом) и docs#54 (DBML v5.17), коммит a76fc3e. Текстовых конфликтов не было; объединённые схемы и тест истории ЮЛ содержат и kpp, и regional_office. make check-full на этом дереве зелёный (до web build включительно). Готово к слиянию.

В ветку влит main после #51 (Основной РФ объектом) и docs#54 (DBML v5.17), коммит a76fc3e. Текстовых конфликтов не было; объединённые схемы и тест истории ЮЛ содержат и kpp, и regional_office. make check-full на этом дереве зелёный (до web build включительно). Готово к слиянию.
aep added 1 commit 2026-10-07 18:10:31 +03:00
aep merged commit 828bcb78f3 into main 2026-10-07 18:14:33 +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#52
No description provided.