model: DBML v5.19 — строки форм со статусами, needs_review, document_issue, crm_id ГСК/ГСЗ (#116)
- financial_statement_line: снята уникальность (meta_id, line_code); row_index, source_ref (частичный уникальный индекс), line_status (enum statement_line_status), line_code_text, parent_row_index, needs_review, is_confirmed - financial_statement_value: source_text, needs_review (хранится — пересмотр п. 4 v5.13), is_confirmed, confirmed_by/at; financial_statement_column: period_kind, label_confidence; financial_statement_meta: form_variant (enum statement_form_variant), needs_review_fields - новая таблица document_issue + enum document_issue_kind, issue_severity, issue_source - recognition_job.statements_version; document: file_ordinal, уникальность типа на файл — только не для BALANCE/INCOME (Р-10); related_group.crm_id (arm-core#112) - changelog и правила заполнения миграции в шапке; entities-v5.19.md; диаграммы части 01, 04, 06 (document_issue — в части 06); ссылки на текущую модель и DBML в Makefile — v5.19 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2
Makefile
@ -5,7 +5,7 @@ VENV := .venv
|
||||
PY := $(if $(wildcard $(VENV)/bin/python),$(CURDIR)/$(VENV)/bin/python,python3)
|
||||
CHANGE ?= slice-0-skeleton
|
||||
# Текущая версия модели данных — по ней рисуются диаграммы (make diagrams)
|
||||
DBML ?= model/data-model-v5.18.dbml
|
||||
DBML ?= model/data-model-v5.19.dbml
|
||||
|
||||
.PHONY: venv validate-contracts validate-openspec test-snapshot test-sync-web sync-web check diagrams
|
||||
|
||||
|
||||
@ -67,7 +67,7 @@ git remote add origin <url-arm-core> && git push -u origin main
|
||||
|
||||
| Слой | Где | Статус | Правило для агента |
|
||||
|---|---|---|---|
|
||||
| Модель данных | `docs/model/data-model-v5.18.dbml` | стабильный, версионируется | единственный источник имён и структур |
|
||||
| Модель данных | `docs/model/data-model-v5.19.dbml` | стабильный, версионируется | единственный источник имён и структур |
|
||||
| Правила домена | `docs/context/05-domain-rules.md` | курируемый — пишет человек/агент по итогам ревью | **единственный вход алгоритмов в код**; из ТЗ напрямую не кодируем |
|
||||
| Открытые вопросы | `docs/context/07-open-questions.md` | живой реестр | каждое допущение в коде — `ASSUMPTION(OQ-nn)` |
|
||||
| Экспорт ТЗ | `docs/source/tz/` | снимок на дату из `docs/source/tz/_export.md` | читать для контекста; расхождение с §05 → вопрос, не код |
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# 03. Архитектура (целевая, по решениям DECISION-1…5 и ARCH-* в DBML v5.18)
|
||||
# 03. Архитектура (целевая, по решениям DECISION-1…5 и ARCH-* в DBML v5.19)
|
||||
|
||||
## Компоненты (= репозитории, см. `00-workspace-layout.md`)
|
||||
|
||||
@ -249,7 +249,7 @@ api/src/
|
||||
# машины статусов, policy — pydantic-модели на входе и выходе
|
||||
services/ # use-cases: оркестрация domain + repositories + outbox + audit_event
|
||||
repositories/ # SQLAlchemy-запросы, в т. ч. запросы-вычисления (сводная ОСВ, шахматка)
|
||||
models/ # ORM 1:1 с DBML v5.18; имена таблиц/колонок/enum — как в DBML
|
||||
models/ # ORM 1:1 с DBML v5.19; имена таблиц/колонок/enum — как в DBML
|
||||
schemas/ # pydantic DTO API /api/v1
|
||||
core/ # config, clients (S3; NATS outbox-publisher и result-consumer), auth (JWT РАИСА / dev-эмитент),
|
||||
# logger, exception_handlers
|
||||
@ -339,7 +339,7 @@ FastAPI» платформы РАИСА/aurora): дерево импортиро
|
||||
`version_table_schema` и `include_name` Alembic). Следуем шаблону, не `public`.
|
||||
- Alembic берёт URL из настроек, не из `alembic.ini`; ревизии — `api/alembic/versions/`, имя файла стандартное
|
||||
`<rev>_<slug>.py`. Автогенерация — только черновик: итоговую ревизию сверяет с DBML `api/scripts/check_dbml_vs_orm.py`.
|
||||
- PK везде `uuid` через `UUIDPrimaryMixin`; имена таблиц, колонок и enum'ов — ровно как в DBML v5.18.
|
||||
- PK везде `uuid` через `UUIDPrimaryMixin`; имена таблиц, колонок и enum'ов — ровно как в DBML v5.19.
|
||||
|
||||
### Инфраструктурные клиенты
|
||||
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
# 04. Как читать модель данных v5.18
|
||||
# 04. Как читать модель данных v5.19
|
||||
|
||||
Файлы: `docs/model/data-model-v5.18.dbml` (источник истины), `docs/model/entities-v5.18.md` (смысл таблиц; предыдущие
|
||||
версии `data-model-v5.13…v5.17.dbml` и `entities-v5.13…v5.17.md` остаются как история),
|
||||
`docs/model/diagrams/part01…09.{svg,png}` (диаграммы v5.18 по частям из таблицы ниже; перерисовываются из DBML командой
|
||||
Файлы: `docs/model/data-model-v5.19.dbml` (источник истины), `docs/model/entities-v5.19.md` (смысл таблиц; предыдущие
|
||||
версии `data-model-v5.13…v5.18.dbml` и `entities-v5.13…v5.18.md` остаются как история),
|
||||
`docs/model/diagrams/part01…09.{svg,png}` (диаграммы v5.19 по частям из таблицы ниже; перерисовываются из DBML командой
|
||||
`make diagrams` в корне репозитория docs — скрипт `scripts/gen_model_diagrams.py`, нужен npx; при новой версии DBML
|
||||
обновить `DBML` в Makefile, а новую таблицу — добавить в раскладку частей скрипта и в эту таблицу).
|
||||
|
||||
@ -15,11 +15,17 @@
|
||||
| 03 Бухгалтерские справочники | `chart_of_account`, `elimination_rule`, `elimination_rule_account`, `required_document_rule` | план счетов (seed из 1С), правила элиминации Прил. 3/4 (версионируются), чек-лист по подходу |
|
||||
| 04 Файлы и распознавание | `s3_object`, `stored_file`, `document`, `recognition_job` | физический файл → задание → логические документы |
|
||||
| 05 Разобранные ОСВ | `osv_entry` | строка ОСВ с шестью суммами, сырым контрагентом и резолвом |
|
||||
| 06 Формы ББ/ОФР | `financial_statement_meta`, `_column`, `_line`, `_value` | шапка, колонки-даты, строки с кодами, значения с confidence |
|
||||
| 06 Формы ББ/ОФР | `financial_statement_meta`, `_column`, `_line`, `_value`, `document_issue` | шапка, колонки-даты, строки со статусами, значения с confidence и `needs_review`, предупреждения и нарушения §7 |
|
||||
| 07 Консолидация | `consolidation`, `consolidation_version`, `_status_history`, `_lock`, `_member`, `_document` | логическая консолидация (ГК × период) и её версии с периметром |
|
||||
| 08 Корректировки и КФО | `correction`, `goodwill`, `kfo_result`, `kfo_result_line`, `kfo_result_line_company`, `client_kfo_line` | ручные решения и результат |
|
||||
| 09 Комментарии, аудит, ЕХ | `comment`, `audit_event`, `ex_snapshot`, `ex_snapshot_member`, `ex_snapshot_item` | полиморфные комментарии, append-only журнал, замороженные срезы |
|
||||
|
||||
**v5.19:** формы ББ/ОФР по контракту v2.0 (change `unified-statement-normalization`, `05-domain-rules.md` §11): строки
|
||||
формы хранятся все — с кодом (повтор кода законен, уникальность `(meta_id, line_code)` снята) и без (`line_status`
|
||||
`unreadable` / `missing` / `detail`); `needs_review` значения и строки **хранится** (пересматривает v5.13); предупреждения и
|
||||
нарушения §7 — `document_issue`; две формы одного типа в файле — разные `document` (`file_ordinal`); чтения «по коду» —
|
||||
агрегат формы по коду (сумма строк `ok`, не хранится). Плюс `related_group.crm_id`.
|
||||
|
||||
**v5.18:** `stored_file.consolidation_id` — в какую консолидацию (период ГК) загружен файл; файлы, загруженные в консолидацию, — основа рабочего стола консоли, общего для её версий (полный состав стола, с файлами документов, привязанных к версиям, — `05-domain-rules.md` §9.5 п. 11). Что использует версия — `consolidation_document`.
|
||||
|
||||
## Соглашения
|
||||
@ -60,9 +66,9 @@
|
||||
## v4 → v5.13: таблица переименований (обязательна при чтении ТЗ)
|
||||
|
||||
v5.14 имена таблиц и полей не менял (добавлены `related_group_member.kind` и два значения `audit_action`), v5.15 — тоже
|
||||
(добавлено значение `osv_data_type.NU`), v5.16 — тоже (колонка `osv_entry.counterparty_match_kind`), v5.17 — тоже (колонка `legal_entity.kpp`), v5.18 — тоже (колонка `stored_file.consolidation_id`), поэтому таблица справедлива и для v5.14…v5.18.
|
||||
(добавлено значение `osv_data_type.NU`), v5.16 — тоже (колонка `osv_entry.counterparty_match_kind`), v5.17 — тоже (колонка `legal_entity.kpp`), v5.18 — тоже (колонка `stored_file.consolidation_id`), v5.19 — тоже (колонки форм, `document_issue`, `related_group.crm_id`), поэтому таблица справедлива и для v5.14…v5.19.
|
||||
|
||||
| В страницах ТЗ (модель v4 и старше) | В v5.13 / v5.14 / v5.15 / v5.16 / v5.17 / v5.18 |
|
||||
| В страницах ТЗ (модель v4 и старше) | В v5.13 / v5.14 / v5.15 / v5.16 / v5.17 / v5.18 / v5.19 |
|
||||
|---|---|
|
||||
| `stored_file.period_year / period_quarter / document_type / osv_account` | `document.period_year / period_quarter / document_type / osv_account_code / is_cumulative` |
|
||||
| `stored_file.status` «Загружен / Обработка / Требуется проверка / Ошибка» | техника: `stored_file.status` UPLOADED/PROCESSING/PROCESSED/ERROR/SUPERSEDED; проверка: `document.status` RECOGNIZED/NEEDS_CHECK/CONFIRMED/ERROR |
|
||||
|
||||
@ -48,9 +48,9 @@
|
||||
|
||||
| Файл | Что |
|
||||
|---|---|
|
||||
| `data-model-v5.18.dbml` | источник истины; changelog v5.1…v5.18 в шапке; блоки «ИСТОЧНИК» над каждой таблицей (v5.13…v5.17 остаются рядом как история) |
|
||||
| `entities-v5.18.md` | описание сущностей по частям 01–09, таблицы «Что изменилось» по версиям, сценарий «как читать модель», открытые вопросы (v5.13…v5.17 остаются как история) |
|
||||
| `diagrams/part01…09.{svg,png}` | диаграммы v5.18 по частям; перерисовываются `make diagrams` (`scripts/gen_model_diagrams.py`) |
|
||||
| `data-model-v5.19.dbml` | источник истины; changelog v5.1…v5.19 в шапке; блоки «ИСТОЧНИК» над каждой таблицей (v5.13…v5.18 остаются рядом как история) |
|
||||
| `entities-v5.19.md` | описание сущностей по частям 01–09, таблицы «Что изменилось» по версиям, сценарий «как читать модель», открытые вопросы (v5.13…v5.18 остаются как история) |
|
||||
| `diagrams/part01…09.{svg,png}` | диаграммы v5.19 по частям; перерисовываются `make diagrams` (`scripts/gen_model_diagrams.py`) |
|
||||
| `source/tz/data-model-part1_4.dbml` (лежит не в `model/`, а в экспорте ТЗ) | v4 часть 1 — историческое |
|
||||
|
||||
## Макет UI
|
||||
|
||||
@ -9,8 +9,8 @@
|
||||
|
||||
1. `CLAUDE.md` (workspace) и `docs/context/00-workspace-layout.md` — как устроена рабочая область, статус аналитики, макет.
|
||||
2. `docs/context/01-project-overview.md`, `02-glossary.md` — предметная область.
|
||||
3. `docs/context/03-architecture.md`, `04-data-model-guide.md`, затем **весь** `docs/model/data-model-v5.18.dbml` и
|
||||
`docs/model/entities-v5.18.md`.
|
||||
3. `docs/context/03-architecture.md`, `04-data-model-guide.md`, затем **весь** `docs/model/data-model-v5.19.dbml` и
|
||||
`docs/model/entities-v5.19.md`.
|
||||
4. `docs/context/05-domain-rules.md` — алгоритмы (особенно §1.0 и §12 — парсеры ищут структуру по содержимому);
|
||||
`06-test-data.md`; `07-open-questions.md`; `10-user-journey.md`; `09-delivery-plan.md`.
|
||||
5. `arm-core/`, `tabular-parser/`, `scan-gateway/` — три репозитория, развёрнутые из нулевого коммита шаблона команды,
|
||||
@ -37,7 +37,7 @@ NATS, MinIO, эмулятор ИС Сканирование), контракт `
|
||||
`07-open-questions.md`; если нужен ответ для среза — делай допущение по правилам из этого файла.
|
||||
|
||||
Ограничения на всё время работы:
|
||||
- имена таблиц, колонок и enum'ов — ровно как в DBML v5.18; поля, которых нет в DBML, не изобретать;
|
||||
- имена таблиц, колонок и enum'ов — ровно как в DBML v5.19; поля, которых нет в DBML, не изобретать;
|
||||
- алгоритмы — только из `05-domain-rules.md`; из страниц ТЗ напрямую не кодировать;
|
||||
- парсеры: никаких координат ячеек, букв колонок, имён листов и номеров строк в коде — структура по содержимому,
|
||||
синонимы в `rules/*.yaml`; фикстуры — регрессия, не спецификация;
|
||||
|
||||
@ -57,7 +57,7 @@ docker compose -f ../docs/dev/docker-compose.yml --project-name arm-ka run --rm
|
||||
|
||||
Для `arm-core` дополнительно:
|
||||
|
||||
- `dbml-check` — `python scripts/check_dbml_vs_orm.py ../../docs/model/data-model-v5.18.dbml` (путь от `api/`, по умолчанию — переменная `DBML` Makefile, она указывает на текущую версию модели;
|
||||
- `dbml-check` — `python scripts/check_dbml_vs_orm.py ../../docs/model/data-model-v5.19.dbml` (путь от `api/`, по умолчанию — переменная `DBML` Makefile, она указывает на текущую версию модели;
|
||||
другой — `make dbml-check DBML=<путь относительно api/>`): ORM обязана совпадать с DBML; расхождения печатаются
|
||||
построчно, код 1.
|
||||
- Цикл миграций «`alembic upgrade head` → `alembic downgrade base` → `alembic upgrade head`» на чистой БД, пустой
|
||||
|
||||
1481
model/data-model-v5.19.dbml
Normal file
|
Before Width: | Height: | Size: 509 KiB After Width: | Height: | Size: 513 KiB |
@ -4,9 +4,9 @@
|
||||
<!-- Generated by graphviz version 2.47.0 (20210316.0004)
|
||||
-->
|
||||
<!-- Title: dbml Pages: 1 -->
|
||||
<svg width="2735pt" height="3808pt"
|
||||
viewBox="0.00 0.00 2735.12 3808.15" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3804.15)">
|
||||
<svg width="2735pt" height="3894pt"
|
||||
viewBox="0.00 0.00 2735.12 3893.90" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 3889.9)">
|
||||
<title>dbml</title>
|
||||
<!-- entity_type -->
|
||||
<g id="entity_type" class="node">
|
||||
@ -26,17 +26,17 @@
|
||||
<!-- related_group_kind -->
|
||||
<g id="related_group_kind" class="node">
|
||||
<title>related_group_kind</title>
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="1774.01" cy="-3436.65" rx="299.63" ry="130.22"/>
|
||||
<polygon fill="#29235c" stroke="transparent" points="1564.01,-3466.65 1564.01,-3526.65 1984.01,-3526.65 1984.01,-3466.65 1564.01,-3466.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3466.65 1564.01,-3526.65 1984.01,-3526.65 1984.01,-3466.65 1564.01,-3466.65"/>
|
||||
<text text-anchor="start" x="1574.82" y="-3487.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group_kind       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="1564.01,-3406.65 1564.01,-3466.65 1984.01,-3466.65 1984.01,-3406.65 1564.01,-3406.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3406.65 1564.01,-3466.65 1984.01,-3466.65 1984.01,-3406.65 1564.01,-3406.65"/>
|
||||
<text text-anchor="start" x="1713.54" y="-3427.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#1d71b8">    gsk    </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="1564.01,-3346.65 1564.01,-3406.65 1984.01,-3406.65 1984.01,-3346.65 1564.01,-3346.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3346.65 1564.01,-3406.65 1984.01,-3406.65 1984.01,-3346.65 1564.01,-3346.65"/>
|
||||
<text text-anchor="start" x="1713.54" y="-3367.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#1d71b8">    gsz    </text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="1563.01,-3345.65 1563.01,-3527.65 1985.01,-3527.65 1985.01,-3345.65 1563.01,-3345.65"/>
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="1774.01" cy="-3514.65" rx="299.63" ry="130.22"/>
|
||||
<polygon fill="#29235c" stroke="transparent" points="1564.01,-3544.65 1564.01,-3604.65 1984.01,-3604.65 1984.01,-3544.65 1564.01,-3544.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3544.65 1564.01,-3604.65 1984.01,-3604.65 1984.01,-3544.65 1564.01,-3544.65"/>
|
||||
<text text-anchor="start" x="1574.82" y="-3565.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group_kind       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="1564.01,-3484.65 1564.01,-3544.65 1984.01,-3544.65 1984.01,-3484.65 1564.01,-3484.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3484.65 1564.01,-3544.65 1984.01,-3544.65 1984.01,-3484.65 1564.01,-3484.65"/>
|
||||
<text text-anchor="start" x="1713.54" y="-3505.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#1d71b8">    gsk    </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="1564.01,-3424.65 1564.01,-3484.65 1984.01,-3484.65 1984.01,-3424.65 1564.01,-3424.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="1564.01,-3424.65 1564.01,-3484.65 1984.01,-3484.65 1984.01,-3424.65 1564.01,-3424.65"/>
|
||||
<text text-anchor="start" x="1713.54" y="-3445.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#1d71b8">    gsz    </text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="1563.01,-3423.65 1563.01,-3605.65 1985.01,-3605.65 1985.01,-3423.65 1563.01,-3423.65"/>
|
||||
</g>
|
||||
<!-- le_history_event -->
|
||||
<g id="le_history_event" class="node">
|
||||
@ -462,42 +462,42 @@
|
||||
<g id="legal_entity_alias" class="node">
|
||||
<title>legal_entity_alias</title>
|
||||
<g id="a_legal_entity_alias"><a xlink:title="legal_entity_alias Словарь соответствий наименований контрагентов (ТЗ 6.5)">
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="341.53" cy="-2166.65" rx="315.24" ry="299.63"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="120.53,-2316.65 120.53,-2376.65 562.53,-2376.65 562.53,-2316.65 120.53,-2316.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2316.65 120.53,-2376.65 562.53,-2376.65 562.53,-2316.65 120.53,-2316.65"/>
|
||||
<text text-anchor="start" x="156.59" y="-2337.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       legal_entity_alias       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2256.65 120.53,-2316.65 562.53,-2316.65 562.53,-2256.65 120.53,-2256.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2256.65 120.53,-2316.65 562.53,-2316.65 562.53,-2256.65 120.53,-2256.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2277.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="156.42" y="-2277.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="491.07" y="-2277.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2196.65 120.53,-2256.65 562.53,-2256.65 562.53,-2196.65 120.53,-2196.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2196.65 120.53,-2256.65 562.53,-2256.65 562.53,-2196.65 120.53,-2196.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2216.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">legal_entity_id    </text>
|
||||
<text text-anchor="start" x="451.97" y="-2217.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="512.44" y="-2217.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.33" y="-2217.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2136.65 120.53,-2196.65 562.53,-2196.65 562.53,-2136.65 120.53,-2136.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2136.65 120.53,-2196.65 562.53,-2196.65 562.53,-2136.65 120.53,-2136.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2156.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">alias    </text>
|
||||
<text text-anchor="start" x="405.77" y="-2157.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="512.44" y="-2157.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.33" y="-2157.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2076.65 120.53,-2136.65 562.53,-2136.65 562.53,-2076.65 120.53,-2076.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2076.65 120.53,-2136.65 562.53,-2136.65 562.53,-2076.65 120.53,-2076.65"/>
|
||||
<text text-anchor="start" x="131.24" y="-2096.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">normalized_alias    </text>
|
||||
<text text-anchor="start" x="406.15" y="-2097.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="512.82" y="-2097.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.72" y="-2097.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2016.65 120.53,-2076.65 562.53,-2076.65 562.53,-2016.65 120.53,-2016.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2016.65 120.53,-2076.65 562.53,-2076.65 562.53,-2016.65 120.53,-2016.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2036.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_by    </text>
|
||||
<text text-anchor="start" x="491.07" y="-2037.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-1956.65 120.53,-2016.65 562.53,-2016.65 562.53,-1956.65 120.53,-1956.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-1956.65 120.53,-2016.65 562.53,-2016.65 562.53,-1956.65 120.53,-1956.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-1976.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_at    </text>
|
||||
<text text-anchor="start" x="379.08" y="-1977.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="119.53,-1955.65 119.53,-2377.65 563.53,-2377.65 563.53,-1955.65 119.53,-1955.65"/>
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="341.53" cy="-2195.65" rx="315.24" ry="299.63"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="120.53,-2345.65 120.53,-2405.65 562.53,-2405.65 562.53,-2345.65 120.53,-2345.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2345.65 120.53,-2405.65 562.53,-2405.65 562.53,-2345.65 120.53,-2345.65"/>
|
||||
<text text-anchor="start" x="156.59" y="-2366.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       legal_entity_alias       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2285.65 120.53,-2345.65 562.53,-2345.65 562.53,-2285.65 120.53,-2285.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2285.65 120.53,-2345.65 562.53,-2345.65 562.53,-2285.65 120.53,-2285.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2306.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="156.42" y="-2306.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="491.07" y="-2306.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2225.65 120.53,-2285.65 562.53,-2285.65 562.53,-2225.65 120.53,-2225.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2225.65 120.53,-2285.65 562.53,-2285.65 562.53,-2225.65 120.53,-2225.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2245.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">legal_entity_id    </text>
|
||||
<text text-anchor="start" x="451.97" y="-2246.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="512.44" y="-2246.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.33" y="-2246.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2165.65 120.53,-2225.65 562.53,-2225.65 562.53,-2165.65 120.53,-2165.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2165.65 120.53,-2225.65 562.53,-2225.65 562.53,-2165.65 120.53,-2165.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2185.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">alias    </text>
|
||||
<text text-anchor="start" x="405.77" y="-2186.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="512.44" y="-2186.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.33" y="-2186.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2105.65 120.53,-2165.65 562.53,-2165.65 562.53,-2105.65 120.53,-2105.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2105.65 120.53,-2165.65 562.53,-2165.65 562.53,-2105.65 120.53,-2105.65"/>
|
||||
<text text-anchor="start" x="131.24" y="-2125.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">normalized_alias    </text>
|
||||
<text text-anchor="start" x="406.15" y="-2126.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="512.82" y="-2126.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="521.72" y="-2126.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-2045.65 120.53,-2105.65 562.53,-2105.65 562.53,-2045.65 120.53,-2045.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-2045.65 120.53,-2105.65 562.53,-2105.65 562.53,-2045.65 120.53,-2045.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2065.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_by    </text>
|
||||
<text text-anchor="start" x="491.07" y="-2066.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="120.53,-1985.65 120.53,-2045.65 562.53,-2045.65 562.53,-1985.65 120.53,-1985.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="120.53,-1985.65 120.53,-2045.65 562.53,-2045.65 562.53,-1985.65 120.53,-1985.65"/>
|
||||
<text text-anchor="start" x="131.53" y="-2005.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_at    </text>
|
||||
<text text-anchor="start" x="379.08" y="-2006.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="119.53,-1984.65 119.53,-2406.65 563.53,-2406.65 563.53,-1984.65 119.53,-1984.65"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
@ -505,165 +505,169 @@
|
||||
<!-- legal_entity_alias->app_user -->
|
||||
<g id="edge22" class="edge">
|
||||
<title>legal_entity_alias:e->app_user:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M563.53,-2046.65C715.65,-2046.65 663.49,-1523.5 683.07,-1372.65 689.31,-1324.56 688.5,-975.31 719.07,-937.65 922.01,-687.62 1169.03,-940.34 1413.44,-730.65 1441.81,-706.31 1417.86,-674.64 1449.44,-654.65 1693.23,-500.38 1876.21,-470.83 2098.57,-654.65 2446.09,-941.93 1845.73,-1647.86 2280.71,-1658.53"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M563.53,-2075.65C722,-2075.65 663.23,-1529.87 683.07,-1372.65 689.14,-1324.53 688.5,-975.31 719.07,-937.65 922.01,-687.62 1169.03,-940.34 1413.44,-730.65 1441.81,-706.31 1417.86,-674.64 1449.44,-654.65 1693.23,-500.38 1876.21,-470.83 2098.57,-654.65 2446.09,-941.93 1845.73,-1647.86 2280.71,-1658.53"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="2280.8,-1662.03 2290.85,-1658.65 2280.89,-1655.03 2280.8,-1662.03"/>
|
||||
<text text-anchor="middle" x="2281.95" y="-1668.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="569.75" y="-2056.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<text text-anchor="middle" x="569.75" y="-2085.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
<!-- legal_entity_alias->legal_entity -->
|
||||
<!-- legal_entity_alias->legal_entity -->
|
||||
<g id="edge20" class="edge">
|
||||
<title>legal_entity_alias:e->legal_entity:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M563.53,-2226.65C849.35,-2226.65 574.78,-2793.55 846.91,-2807.39"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="847.17,-2810.9 857.25,-2807.65 847.34,-2803.9 847.17,-2810.9"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M563.53,-2255.65C837.91,-2255.65 585.92,-2793.72 846.93,-2807.39"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="847.17,-2810.89 857.25,-2807.65 847.35,-2803.9 847.17,-2810.89"/>
|
||||
<text text-anchor="middle" x="866.15" y="-2778.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="569.75" y="-2236.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<text text-anchor="middle" x="569.75" y="-2265.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
<!-- related_group -->
|
||||
<g id="related_group" class="node">
|
||||
<title>related_group</title>
|
||||
<g id="a_related_group"><a xlink:title="related_group ГСК/ГСЗ — current-state. Иерархия групп не поддерживается (ТЗ 6.1)">
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="1066.25" cy="-3392.65" rx="305.44" ry="299.63"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="852.25,-3542.65 852.25,-3602.65 1280.25,-3602.65 1280.25,-3542.65 852.25,-3542.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3542.65 852.25,-3602.65 1280.25,-3602.65 1280.25,-3542.65 852.25,-3542.65"/>
|
||||
<text text-anchor="start" x="905.31" y="-3563.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3482.65 852.25,-3542.65 1280.25,-3542.65 1280.25,-3482.65 852.25,-3482.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3482.65 852.25,-3542.65 1280.25,-3542.65 1280.25,-3482.65 852.25,-3482.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3503.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="888.14" y="-3503.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="1208.79" y="-3503.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3422.65 852.25,-3482.65 1280.25,-3482.65 1280.25,-3422.65 852.25,-3422.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3422.65 852.25,-3482.65 1280.25,-3482.65 1280.25,-3422.65 852.25,-3422.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3442.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">code    </text>
|
||||
<text text-anchor="start" x="1123.49" y="-3443.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="1230.16" y="-3443.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.06" y="-3443.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3362.65 852.25,-3422.65 1280.25,-3422.65 1280.25,-3362.65 852.25,-3362.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3362.65 852.25,-3422.65 1280.25,-3422.65 1280.25,-3362.65 852.25,-3362.65"/>
|
||||
<text text-anchor="start" x="862.93" y="-3382.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">company_group_id    </text>
|
||||
<text text-anchor="start" x="1169.98" y="-3383.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="1230.44" y="-3383.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.34" y="-3383.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3302.65 852.25,-3362.65 1280.25,-3362.65 1280.25,-3302.65 852.25,-3302.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3302.65 852.25,-3362.65 1280.25,-3362.65 1280.25,-3302.65 852.25,-3302.65"/>
|
||||
<text text-anchor="start" x="863.13" y="-3322.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">kind    </text>
|
||||
<text text-anchor="start" x="956.78" y="-3323.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">related_group_kind</text>
|
||||
<text text-anchor="start" x="1230.64" y="-3323.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.53" y="-3323.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3242.65 852.25,-3302.65 1280.25,-3302.65 1280.25,-3242.65 852.25,-3242.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3242.65 852.25,-3302.65 1280.25,-3302.65 1280.25,-3242.65 852.25,-3242.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3262.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">name    </text>
|
||||
<text text-anchor="start" x="1123.49" y="-3263.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="1230.16" y="-3263.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.06" y="-3263.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3182.65 852.25,-3242.65 1280.25,-3242.65 1280.25,-3182.65 852.25,-3182.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3182.65 852.25,-3242.65 1280.25,-3242.65 1280.25,-3182.65 852.25,-3182.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3202.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_date    </text>
|
||||
<text text-anchor="start" x="1207" y="-3203.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">date</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="851.25,-3181.65 851.25,-3603.65 1281.25,-3603.65 1281.25,-3181.65 851.25,-3181.65"/>
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="1066.25" cy="-3434.65" rx="305.44" ry="342.48"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="852.25,-3614.65 852.25,-3674.65 1280.25,-3674.65 1280.25,-3614.65 852.25,-3614.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3614.65 852.25,-3674.65 1280.25,-3674.65 1280.25,-3614.65 852.25,-3614.65"/>
|
||||
<text text-anchor="start" x="905.31" y="-3635.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3554.65 852.25,-3614.65 1280.25,-3614.65 1280.25,-3554.65 852.25,-3554.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3554.65 852.25,-3614.65 1280.25,-3614.65 1280.25,-3554.65 852.25,-3554.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3575.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="888.14" y="-3575.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="1208.79" y="-3575.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3494.65 852.25,-3554.65 1280.25,-3554.65 1280.25,-3494.65 852.25,-3494.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3494.65 852.25,-3554.65 1280.25,-3554.65 1280.25,-3494.65 852.25,-3494.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3514.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">code    </text>
|
||||
<text text-anchor="start" x="1123.49" y="-3515.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="1230.16" y="-3515.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.06" y="-3515.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3434.65 852.25,-3494.65 1280.25,-3494.65 1280.25,-3434.65 852.25,-3434.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3434.65 852.25,-3494.65 1280.25,-3494.65 1280.25,-3434.65 852.25,-3434.65"/>
|
||||
<text text-anchor="start" x="862.93" y="-3454.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">company_group_id    </text>
|
||||
<text text-anchor="start" x="1169.98" y="-3455.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="1230.44" y="-3455.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.34" y="-3455.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3374.65 852.25,-3434.65 1280.25,-3434.65 1280.25,-3374.65 852.25,-3374.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3374.65 852.25,-3434.65 1280.25,-3434.65 1280.25,-3374.65 852.25,-3374.65"/>
|
||||
<text text-anchor="start" x="863.13" y="-3394.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">kind    </text>
|
||||
<text text-anchor="start" x="956.78" y="-3395.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">related_group_kind</text>
|
||||
<text text-anchor="start" x="1230.64" y="-3395.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.53" y="-3395.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3314.65 852.25,-3374.65 1280.25,-3374.65 1280.25,-3314.65 852.25,-3314.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3314.65 852.25,-3374.65 1280.25,-3374.65 1280.25,-3314.65 852.25,-3314.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3334.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">name    </text>
|
||||
<text text-anchor="start" x="1123.49" y="-3335.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<text text-anchor="start" x="1230.16" y="-3335.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="1239.06" y="-3335.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3254.65 852.25,-3314.65 1280.25,-3314.65 1280.25,-3254.65 852.25,-3254.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3254.65 852.25,-3314.65 1280.25,-3314.65 1280.25,-3254.65 852.25,-3254.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3274.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_date    </text>
|
||||
<text text-anchor="start" x="1207" y="-3275.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">date</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="852.25,-3194.65 852.25,-3254.65 1280.25,-3254.65 1280.25,-3194.65 852.25,-3194.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="852.25,-3194.65 852.25,-3254.65 1280.25,-3254.65 1280.25,-3194.65 852.25,-3194.65"/>
|
||||
<text text-anchor="start" x="863.25" y="-3214.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">crm_id    </text>
|
||||
<text text-anchor="start" x="1162.58" y="-3215.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">varchar</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="851.25,-3193.65 851.25,-3675.65 1281.25,-3675.65 1281.25,-3193.65 851.25,-3193.65"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- related_group->related_group_kind -->
|
||||
<g id="edge34" class="edge">
|
||||
<title>related_group:e->related_group_kind:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M1281.25,-3332.65C1426.15,-3332.65 1418.11,-3496.65 1563.01,-3496.65"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M1281.25,-3404.65C1427.51,-3404.65 1416.75,-3574.65 1563.01,-3574.65"/>
|
||||
</g>
|
||||
<!-- related_group->company_group -->
|
||||
<!-- related_group->company_group -->
|
||||
<g id="edge24" class="edge">
|
||||
<title>related_group:e->company_group:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M1281.25,-3392.65C1430.63,-3392.65 1363.85,-3224.55 1413.44,-3083.65 1484.91,-2880.64 1332.31,-2618.26 1535.72,-2609.86"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M1281.25,-3464.65C1460.49,-3464.65 1359.91,-3254.7 1413.44,-3083.65 1477.73,-2878.25 1332.08,-2618.18 1535.72,-2609.86"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="1536.08,-2613.35 1546.01,-2609.65 1535.94,-2606.35 1536.08,-2613.35"/>
|
||||
<text text-anchor="middle" x="1554.9" y="-2619.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="1287.48" y="-3402.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<text text-anchor="middle" x="1287.48" y="-3474.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
<!-- related_group_member -->
|
||||
<g id="related_group_member" class="node">
|
||||
<title>related_group_member</title>
|
||||
<g id="a_related_group_member"><a xlink:title="related_group_member Состав ГСК/ГСЗ — SCD2. Исключение = закрытие версии (valid_to, is_current=false)">
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="341.53" cy="-3332.65" rx="341.57" ry="384.83"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="102.53,-3542.65 102.53,-3602.65 581.53,-3602.65 581.53,-3542.65 102.53,-3542.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3542.65 102.53,-3602.65 581.53,-3602.65 581.53,-3542.65 102.53,-3542.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3563.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group_member       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3482.65 102.53,-3542.65 581.53,-3542.65 581.53,-3482.65 102.53,-3482.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3482.65 102.53,-3542.65 581.53,-3542.65 581.53,-3482.65 102.53,-3482.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3503.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="138.42" y="-3503.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="510.07" y="-3503.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3422.65 102.53,-3482.65 581.53,-3482.65 581.53,-3422.65 102.53,-3422.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3422.65 102.53,-3482.65 581.53,-3482.65 581.53,-3422.65 102.53,-3422.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3442.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">related_group_id    </text>
|
||||
<text text-anchor="start" x="470.97" y="-3443.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="531.44" y="-3443.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3443.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3362.65 102.53,-3422.65 581.53,-3422.65 581.53,-3362.65 102.53,-3362.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3362.65 102.53,-3422.65 581.53,-3422.65 581.53,-3362.65 102.53,-3362.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3382.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">legal_entity_id    </text>
|
||||
<text text-anchor="start" x="470.97" y="-3383.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="531.44" y="-3383.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3383.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3302.65 102.53,-3362.65 581.53,-3362.65 581.53,-3302.65 102.53,-3302.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3302.65 102.53,-3362.65 581.53,-3362.65 581.53,-3302.65 102.53,-3302.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3322.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">kind    </text>
|
||||
<text text-anchor="start" x="257.58" y="-3323.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">related_group_kind</text>
|
||||
<text text-anchor="start" x="531.44" y="-3323.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3323.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3242.65 102.53,-3302.65 581.53,-3302.65 581.53,-3242.65 102.53,-3242.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3242.65 102.53,-3302.65 581.53,-3302.65 581.53,-3242.65 102.53,-3242.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3262.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">valid_from    </text>
|
||||
<text text-anchor="start" x="358.99" y="-3263.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<text text-anchor="start" x="531.44" y="-3263.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3263.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3182.65 102.53,-3242.65 581.53,-3242.65 581.53,-3182.65 102.53,-3182.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3182.65 102.53,-3242.65 581.53,-3242.65 581.53,-3182.65 102.53,-3182.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3202.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">valid_to    </text>
|
||||
<text text-anchor="start" x="398.08" y="-3203.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3122.65 102.53,-3182.65 581.53,-3182.65 581.53,-3122.65 102.53,-3122.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3122.65 102.53,-3182.65 581.53,-3182.65 581.53,-3122.65 102.53,-3122.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3142.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">is_current    </text>
|
||||
<text text-anchor="start" x="417.61" y="-3143.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">boolean</text>
|
||||
<text text-anchor="start" x="531.44" y="-3143.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3143.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3062.65 102.53,-3122.65 581.53,-3122.65 581.53,-3062.65 102.53,-3062.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3062.65 102.53,-3122.65 581.53,-3122.65 581.53,-3062.65 102.53,-3062.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3082.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_by    </text>
|
||||
<text text-anchor="start" x="510.07" y="-3083.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="101.03,-3061.65 101.03,-3603.65 582.03,-3603.65 582.03,-3061.65 101.03,-3061.65"/>
|
||||
<ellipse fill="none" stroke="black" stroke-width="0" cx="341.53" cy="-3404.65" rx="341.57" ry="384.83"/>
|
||||
<polygon fill="#1d71b8" stroke="transparent" points="102.53,-3614.65 102.53,-3674.65 581.53,-3674.65 581.53,-3614.65 102.53,-3614.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3614.65 102.53,-3674.65 581.53,-3674.65 581.53,-3614.65 102.53,-3614.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3635.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#ffffff">       related_group_member       </text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3554.65 102.53,-3614.65 581.53,-3614.65 581.53,-3554.65 102.53,-3554.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3554.65 102.53,-3614.65 581.53,-3614.65 581.53,-3554.65 102.53,-3554.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3575.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">id</text>
|
||||
<text text-anchor="start" x="138.42" y="-3575.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">    </text>
|
||||
<text text-anchor="start" x="510.07" y="-3575.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3494.65 102.53,-3554.65 581.53,-3554.65 581.53,-3494.65 102.53,-3494.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3494.65 102.53,-3554.65 581.53,-3554.65 581.53,-3494.65 102.53,-3494.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3514.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">related_group_id    </text>
|
||||
<text text-anchor="start" x="470.97" y="-3515.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="531.44" y="-3515.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3515.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3434.65 102.53,-3494.65 581.53,-3494.65 581.53,-3434.65 102.53,-3434.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3434.65 102.53,-3494.65 581.53,-3494.65 581.53,-3434.65 102.53,-3434.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3454.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">legal_entity_id    </text>
|
||||
<text text-anchor="start" x="470.97" y="-3455.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<text text-anchor="start" x="531.44" y="-3455.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3455.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3374.65 102.53,-3434.65 581.53,-3434.65 581.53,-3374.65 102.53,-3374.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3374.65 102.53,-3434.65 581.53,-3434.65 581.53,-3374.65 102.53,-3374.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3394.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">kind    </text>
|
||||
<text text-anchor="start" x="257.58" y="-3395.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">related_group_kind</text>
|
||||
<text text-anchor="start" x="531.44" y="-3395.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3395.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3314.65 102.53,-3374.65 581.53,-3374.65 581.53,-3314.65 102.53,-3314.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3314.65 102.53,-3374.65 581.53,-3374.65 581.53,-3314.65 102.53,-3314.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3334.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">valid_from    </text>
|
||||
<text text-anchor="start" x="358.99" y="-3335.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<text text-anchor="start" x="531.44" y="-3335.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3335.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3254.65 102.53,-3314.65 581.53,-3314.65 581.53,-3254.65 102.53,-3254.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3254.65 102.53,-3314.65 581.53,-3314.65 581.53,-3254.65 102.53,-3254.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3274.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">valid_to    </text>
|
||||
<text text-anchor="start" x="398.08" y="-3275.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">timestamptz</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3194.65 102.53,-3254.65 581.53,-3254.65 581.53,-3194.65 102.53,-3194.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3194.65 102.53,-3254.65 581.53,-3254.65 581.53,-3194.65 102.53,-3194.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3214.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">is_current    </text>
|
||||
<text text-anchor="start" x="417.61" y="-3215.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">boolean</text>
|
||||
<text text-anchor="start" x="531.44" y="-3215.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c"> </text>
|
||||
<text text-anchor="start" x="540.33" y="-3215.85" font-family="Helvetica,sans-Serif" font-weight="bold" font-size="32.00" fill="#29235c">(!)</text>
|
||||
<polygon fill="#e7e2dd" stroke="transparent" points="102.53,-3134.65 102.53,-3194.65 581.53,-3194.65 581.53,-3134.65 102.53,-3134.65"/>
|
||||
<polygon fill="none" stroke="#29235c" points="102.53,-3134.65 102.53,-3194.65 581.53,-3194.65 581.53,-3134.65 102.53,-3134.65"/>
|
||||
<text text-anchor="start" x="113.53" y="-3154.85" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">created_by    </text>
|
||||
<text text-anchor="start" x="510.07" y="-3155.85" font-family="Helvetica,sans-Serif" font-style="italic" font-size="32.00" fill="#29235c">uuid</text>
|
||||
<polygon fill="none" stroke="#29235c" stroke-width="2" points="101.03,-3133.65 101.03,-3675.65 582.03,-3675.65 582.03,-3133.65 101.03,-3133.65"/>
|
||||
</a>
|
||||
</g>
|
||||
</g>
|
||||
<!-- related_group_member->related_group_kind -->
|
||||
<g id="edge35" class="edge">
|
||||
<title>related_group_member:e->related_group_kind:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3332.65C757.4,-3332.65 575.56,-3601.73 719.07,-3701.65 782.38,-3745.74 1344.67,-3736.61 1413.44,-3701.65 1513.98,-3650.55 1450.22,-3496.65 1563.01,-3496.65"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3404.65C762.41,-3404.65 571.97,-3682.11 719.07,-3785.65 782.16,-3830.06 1344.91,-3821.08 1413.44,-3785.65 1515.56,-3732.87 1448.06,-3574.65 1563.01,-3574.65"/>
|
||||
</g>
|
||||
<!-- related_group_member->app_user -->
|
||||
<!-- related_group_member->app_user -->
|
||||
<g id="edge30" class="edge">
|
||||
<title>related_group_member:e->app_user:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3092.65C721.45,-3092.65 670.07,-2613.96 683.07,-2475.65 686.68,-2437.17 691.38,-1111.63 719.07,-1084.65 940.2,-869.16 1859.27,-1055.53 2098.57,-1250.65 2251.2,-1375.1 2096.04,-1648.81 2280.61,-1658.39"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3164.65C730.89,-3164.65 669.99,-2652.43 683.07,-2504.65 686.54,-2465.35 690.81,-1112.2 719.07,-1084.65 940.15,-869.1 1859.27,-1055.53 2098.57,-1250.65 2251.2,-1375.1 2096.04,-1648.81 2280.61,-1658.39"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="2280.76,-1661.9 2290.85,-1658.65 2280.94,-1654.9 2280.76,-1661.9"/>
|
||||
<text text-anchor="middle" x="2299.74" y="-1668.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3102.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3174.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
<!-- related_group_member->legal_entity -->
|
||||
<!-- related_group_member->legal_entity -->
|
||||
<g id="edge28" class="edge">
|
||||
<title>related_group_member:e->legal_entity:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3392.65C732.67,-3392.65 655.1,-3219.48 719.07,-3083.65 776.03,-2962.69 722.91,-2815.35 847.18,-2807.94"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="847.36,-2811.44 857.25,-2807.65 847.16,-2804.44 847.36,-2811.44"/>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3464.65C762.41,-3464.65 648.33,-3249.04 719.07,-3083.65 771.64,-2960.72 722.69,-2815.25 847.17,-2807.94"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="847.36,-2811.43 857.25,-2807.65 847.16,-2804.44 847.36,-2811.43"/>
|
||||
<text text-anchor="middle" x="848.36" y="-2817.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3402.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3474.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
<!-- related_group_member->related_group -->
|
||||
<!-- related_group_member->related_group -->
|
||||
<g id="edge26" class="edge">
|
||||
<title>related_group_member:e->related_group:w</title>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3452.65C701.44,-3452.65 727.44,-3509.3 841.09,-3512.51"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="841.21,-3516.01 851.25,-3512.65 841.3,-3509.01 841.21,-3516.01"/>
|
||||
<text text-anchor="middle" x="860.15" y="-3522.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3462.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
<path fill="none" stroke="#29235c" stroke-width="3" d="M582.53,-3524.65C701.44,-3524.65 727.44,-3581.3 841.09,-3584.51"/>
|
||||
<polygon fill="#29235c" stroke="#29235c" stroke-width="3" points="841.21,-3588.01 851.25,-3584.65 841.3,-3581.01 841.21,-3588.01"/>
|
||||
<text text-anchor="middle" x="860.15" y="-3594.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">1</text>
|
||||
<text text-anchor="middle" x="588.75" y="-3534.25" font-family="Helvetica,sans-Serif" font-size="32.00" fill="#29235c">*</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 471 KiB After Width: | Height: | Size: 478 KiB |
|
Before Width: | Height: | Size: 94 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 338 KiB After Width: | Height: | Size: 554 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 91 KiB |
204
model/entities-v5.19.md
Normal file
@ -0,0 +1,204 @@
|
||||
# АРМ КА — описание сущностей модели данных v5.19
|
||||
|
||||
Источник истины по структуре — `data-model-v5.19.dbml` (полный). Диаграммы по частям — `diagrams/` (part01…09 svg/png; перерисовываются `make diagrams` из текущего DBML). Здесь — что каждая таблица значит для бизнеса, как связана с соседями и откуда взялась.
|
||||
|
||||
## Что изменилось в v5.19 (решения владельца 17.10.2026, Р-1…Р-19; RSHB/arm-ka-docs#116)
|
||||
|
||||
Change `openspec/changes/unified-statement-normalization`: формы ББ/ОФР нормализуются общим кодом сервисов, контракт
|
||||
результата v2.0; ядро хранит результат как пришёл (`context/05-domain-rules.md` §11, §9.3, §9.5).
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | `financial_statement_line`: снята уникальность `(meta_id, line_code)` (индекс остаётся неуникальным); новые `row_index`, `source_ref` (частичный уникальный `(meta_id, source_ref) WHERE source_ref IS NOT NULL`), `line_status` (enum `statement_line_status`: `ok` / `unreadable` / `missing` / `detail`), `line_code_text`, `parent_row_index`, `needs_review`, `is_confirmed` | Повтор кода — законный случай (один код, разные наименования; Р-4): хранятся все строки, чтения «по коду» идут через агрегат формы по коду (сумма строк `ok`, не хранится — DECISION-5). Строки без кода хранятся со статусом (Р-8, отменяет OQ-36 / OQ-141): `detail` — расшифровка под строкой с кодом, в §7, агрегаты, КФО и ЕХ не входит; `unreadable` / `missing` блокируют подтверждение, пока у них есть суммы (Р-13). Порядок и положение в источнике (`row_index`, `source_ref`) нужны экрану, чтобы показать строку и предупреждение у места |
|
||||
| 2 | `financial_statement_value`: `source_text`, `needs_review`, `is_confirmed`, `confirmed_by`, `confirmed_at` | `needs_review` **хранится** (пересматривает п. 4 v5.13): его считает сервис («подтверждение проверкой» §7 — Р-5, Р-7), ядро пересчитывает только после правок; подтверждение ячейки без правки аналитиком переживает пересчёт. Сырой текст источника — подсказка ячейки |
|
||||
| 3 | `financial_statement_column`: `period_kind`, `label_confidence` | Относительные подписи бланка 66н («На отчётную дату», «На 31 декабря предыдущего года») — дата колонки от эффективной даты документа, ядро досчитывает после правки даты отчёта (Р-6); колонка без даты остаётся с `period_kind = none` |
|
||||
| 4 | `financial_statement_meta`: `form_variant` (enum `statement_form_variant`), `needs_review_fields` | Упрощённая форма — свой набор соотношений §7; поля шапки, требующие проверки (сейчас — неуверенная дата отчёта) |
|
||||
| 5 | Новая таблица `document_issue` + enum `document_issue_kind`, `issue_severity`, `issue_source` | Предупреждения и нарушения §7 документа с уровнем и привязкой к строкам (`line_ids`), колонке, полю шапки; как пришли от сервиса или посчитаны ядром. Очищается при перезагрузке файла; при пересчёте после правки `relation` / `soft` заменяются целиком, `warning` сервиса сохраняются, кроме снимаемых правкой |
|
||||
| 6 | `recognition_job.statements_version` | Коммит копии общего кода `arm_statements`, которым посчитан результат (`service.statements_version`); расхождение с копией ядра при пересчёте — `info` |
|
||||
| 7 | `document`: уникальность `(stored_file_id, document_type, osv_account_code)` — частичная, кроме `BALANCE` / `INCOME`; новая колонка `file_ordinal` + уникальный `(stored_file_id, file_ordinal)` | Вторая форма того же типа в файле хранится (Р-10, Р-15); при двух формах одного типа и периода ни одна не автоподтверждается, подтверждение второй при подтверждённой первой — 409 `DUPLICATE_FORM` (Р-18). ОСВ по счёту, расшифровка и прочий — по-прежнему один на тип на файл (§9.5 п. 2) |
|
||||
| 8 | `related_group.crm_id` (`varchar`, nullable, unique) | ID ГСК/ГСЗ в ЕЦП CRM из форм `51-03`, `51-04`, `77-02` (AURORA-1619, arm-core#112, OQ-33); вводится вручную, импорт ЕЦП не заполняет (OQ-91); уникален, как `crm_id` ГК и ЮЛ |
|
||||
|
||||
Остальные таблицы и enum — как в v5.18 (44 таблицы, 33 enum). Реализация — одна миграция в `arm-core`; заполнение:
|
||||
`row_index` — по возрастанию `line_code` в форме, `line_status = ok`, `needs_review` значений — по прежнему правилу
|
||||
`values_ok`, `source_text = string_value`, `period_kind` — `absolute` при `period_date`, иначе `none`, `file_ordinal` — по
|
||||
`(created_at, id)` в файле.
|
||||
|
||||
## Что изменилось в v5.18 (решения владельца 09.10.2026, RSHB/arm-ka-docs#90)
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | `stored_file.consolidation_id` (`uuid`, nullable, FK → `consolidation`) + индекс `(legal_entity_id, consolidation_id)` | Файл загружается **в консолидацию** (период ГК) и становится основой её «рабочего стола» (полный состав стола — `context/05-domain-rules.md` §9.5 п. 11), общего для всех версий периода; `NULL` — загрузка без контекста (страница ЮЛ, монозаёмщики, API). Панель «Первичные документы» в версии показывает рабочий стол консоли для ЮЛ плюс файлы с документами, привязанными к версиям консоли. Что использует конкретная версия — по-прежнему `consolidation_document`; заморозка после `VERIFIED` — привязки и `ex_snapshot`. Привязка файла к **версии** (`consolidation_file`) отвергнута: рабочие версии периода делят первичку, а новая версия после `VERIFIED` подхватывает подтверждённое (`openspec/changes/console-files/design.md`) |
|
||||
| 2 | Note `recognition_job.reply_deadline` | Без изменения структуры: срок ответа OCR — 20 мин (OQ-159) |
|
||||
|
||||
Остальные таблицы и enum — как в v5.17. Реализация — миграция `0006` в `arm-core` (backfill `consolidation_id` по `consolidation_document`).
|
||||
|
||||
## Что изменилось в v5.17 (решение владельца 07.10.2026, пересмотр OQ-31, RSHB/arm-ka-docs#53)
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | `legal_entity.kpp` и `legal_entity_history.kpp` (`varchar`, nullable) | КПП юридического лица нужен (макет: колонка «КПП» на экранах `50`, `61`, поле форм `51-02`, `79`; фронтенд: «в ручке получения ЮЛ не приходит КПП»). Формат — 9 символов: 4 цифры, 2 символа (цифра или латинская A–Z), 3 цифры, иначе `INVALID_KPP`. У ИП (`entity_type = ИП`) КПП запрещён. Для ЮЛ необязателен: существующие записи и импорт без колонки остаются валидными. Уникален по-прежнему только `inn` (КПП — атрибут; сопоставление контрагентов ОСВ по ИНН не меняется). Изменение КПП — обычная правка со снимком в `legal_entity_history`. Отменяет п. 2 v5.14 («КПП не вводится») |
|
||||
|
||||
Остальные таблицы и enum — как в v5.16. Реализация — миграция `0005` в `arm-core`.
|
||||
|
||||
## Что изменилось в v5.16 (Срез 4, решения владельца 06.10.2026)
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | Enum `counterparty_match_kind` (`INN`, `NAME`, `ALIAS`, `MANUAL`, `PROPAGATED`) и колонка `osv_entry.counterparty_match_kind` (nullable) | Способ сопоставления контрагента строки ОСВ хранится. `NULL` ⇔ `counterparty_id` `NULL`; `INN` / `NAME` / `ALIAS` — шаг автоматического резолва при маппинге (ИНН; точное имя; нормализованное имя ЮЛ или алиас); `MANUAL` — ручное сопоставление аналитиком; `PROPAGATED` — автоприменение по имени в версии (DOC-221278 п. 12–13). Вычислять на чтение нельзя: после ручного связывания появляется алиас, и ручное сопоставление неотличимо от `ALIAS`. Миграция `0004` заполняет колонку по уже смапленным строкам (ИНН без пробелов = `legal_entity.inn` → `INN`; `trim(name) = legal_entity.name` → `NAME`; остальные с `counterparty_id` → `ALIAS` — приближение: ручных сопоставлений до Среза 4 не было) |
|
||||
| 2 | Семантика `consolidation_document` | Без изменения структуры: строка создаётся при подтверждении документа (по документам ЮЛ — членов периметра версий «в работе») и при добавлении ЮЛ в периметр (подтверждённые подходящие документы подхватываются); удаляется при замене/удалении файла и исключении ЮЛ из периметра. Для одной (ЮЛ, `document_type`, `osv_account_code`, период, признак нарастающего) привязан один документ — самый поздний `confirmed_at` (D-5 Среза 4) |
|
||||
| 3 | Семантика `consolidation_lock` | Без изменения структуры: блокировка без истечения по времени — активна, пока её не снял владелец, администратор или не перехватил другой пользователь с `CONSOLIDATION_EDIT` по причине (OQ-119) |
|
||||
|
||||
Пробелы квартальной склейки и сама сводная ОСВ по-прежнему не хранятся (DECISION-5). Остальные таблицы и enum — как в v5.15 (43 таблицы; enum — 28). Реализация — миграция `0004` в `arm-core`.
|
||||
|
||||
## Что изменилось в v5.15 (Срез 2c, решения владельца 05.10.2026)
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | `osv_data_type` + `NU` (после `BU`) | Строки налогового учёта из ОСВ «БУ, НУ» хранятся в `osv_entry` как есть (OQ-45); контракт результата допускал `NU` с v1.0, ядро раньше такой строки принять не могло |
|
||||
| 2 | `app_user.email` — в нижнем регистре | Без изменения структуры: нормализация при записи (seed, администрирование), поиск по `lower(email)` сохраняется, уникальность — существующий UNIQUE по `email` (OQ-59). Expression-индекс `lower(email)` не вводится: сверка ORM↔DBML не умеет expression-индексы. Миграция `0003` приводит существующие email к нижнему регистру (при дублях по регистру — падает, слияние решает человек) |
|
||||
| 3 | Семантика `stored_file.status`, `recognition_job.group_schema` | Без изменения структуры: `PROCESSING` ставит inbox по ack сервиса, `PROCESSED`/`ERROR` — цикл маппинга результата (OQ-67); маппинг выполняется отдельно от inbox (OQ-69); `group_schema` заполняет маппер; «Итого» в `osv_entry` не хранится (OQ-01) |
|
||||
| 4 | Индексы `osv_entry (parent_entry_id)`, `osv_entry (recognition_job_id)`, `stored_file (current_recognition_job_id)` | Индексы для удаления файла и обхода дерева строк: без них проверки FK (в том числе self-FK `parent_entry_id`) при `DELETE /files/{id}` и очистке файла перед повторным маппингом шли seq scan'ом. Замер: DELETE документа 1000 строк 8,6 с → 16 мс на 200 тыс. строк. Обычные (не unique) индексы; закрывает OQ-117 (I-1 финального ревью Среза 2c) |
|
||||
|
||||
Остальные таблицы и enum — как в v5.14 (43 таблицы, 27 enum). Реализация — миграция `0003` в `arm-core`.
|
||||
|
||||
## Что изменилось в v5.14 (Срез 1, решения владельца 04.10.2026)
|
||||
|
||||
| № | Изменение | Решение |
|
||||
|---|---|---|
|
||||
| 1 | `related_group_member.kind` + индекс `(legal_entity_id, kind) WHERE is_current` | ЮЛ состоит **одновременно в одной ГСК и одной ГСЗ** (но только в одной группе каждого вида). Отменяет ANL-030 / v5.8 («только в одной ГСК или ГСЗ»). `kind` — денормализация `related_group.kind` (равенство проверяет ядро при записи, тест на рассинхрон); индекс не выразить через join, триггер не выбран. Закрывает OQ-32 |
|
||||
| 2 | КПП | **Не вводится** *(отменено в v5.17: КПП введён)*. Поле есть только в макете; у `legal_entity` его нет, импорт его не читает (закрывал OQ-31 до v5.17) |
|
||||
| 3 | Семантика `company_group.crm_id`, `base_regional_office_id` | Без изменения структуры: `crm_id` = «iD ГК» выгрузки ЕЦП CRM, `base_regional_office_id` = «Базовый РФ ГК в CRM»; флаги «входит в ГСК/ГСЗ» выгрузки → членство в одной неявной ГСК/ГСЗ на ГК (правила — `05-domain-rules.md` §13) |
|
||||
| 4 | `audit_action` + `LEGAL_ENTITY_CHANGE`, `USER_CHANGE` | Журнал изменений ЮЛ (создание/изменение/закрытие/перевод, алиасы) и пользователей (создание/деактивация администратором) — ТЗ 8.2; в v5.13 для них не было действия (были `GROUP_CHANGE`, `MEMBERSHIP_CHANGE`, `USER_ROLE_CHANGE`) |
|
||||
|
||||
Остальные таблицы и enum — как в v5.13 (43 таблицы). Реализация — миграция `0002` в `arm-core`.
|
||||
|
||||
## Что изменилось в v5.13 (ревью 30.09–01.10)
|
||||
|
||||
| № | Замечание | Решение |
|
||||
|---|---|---|
|
||||
| 1 | Вместо RBAC «в коде» — роли **и** права | `permission` + `role_permission` возвращены; права только через роли, прямых назначений пользователю нет. Исключения — заведением роли |
|
||||
| 2 | `osv_entry.parent_entry_id` не нужен — храним только строки с контрагентами | **Отложено.** Открыт вопрос: хранить ли строки уровня ACCOUNT для сверки «Σ контрагентов = итог счёта»; аналитика «Парсинг ОСВ» п.11 пока говорит «все строки» |
|
||||
| 3 | `osv_group_schema` не особо нужна | Убрана. Схема шапки — `recognition_job.group_schema jsonb`; тип строки — `osv_entry.group_type` |
|
||||
| 4 | `financial_statement_value.needs_review` непонятен | Убран: производное от `confidence` / `is_recognized`, порог может меняться |
|
||||
| 5 | В `recognition_job` не нужны и `result`, и `raw_result` | Оставлен только `result_s3_object_id`. Сырой ответ ИС Сканирование — S3 `raw/{job_id}.json` по конвенции, в БД не регистрируется |
|
||||
| 6 | `stored_file.fields_modified` — что это | Счётчик «исправлено полей» с карточки документа (v5.7). Убран — `COUNT(is_modified)` по данным |
|
||||
| 6-бис | `document_type` не предусматривает несколько ОСВ или ББ+ОФР в одном файле | **Разделение файл / документ**: `stored_file` — физический файл, `document` — логическая единица (1:N). Чек-лист, проверки, подтверждение, FK разобранных данных, `consolidation_document`, `ex_snapshot_item` — на `document`. Замена (`superseded_by`) — файл целиком |
|
||||
| 7 | `file_type`: убрать Р7 | Убран. `xls/xlsx/xlsb → tabular-parser`, `pdf/png/jpg → scan-gateway` |
|
||||
|
||||
**Принципы модели (коротко):**
|
||||
- Первичка не редактируется: файлы и распознанные значения хранятся как пришли; правки аналитика — рядом (`is_modified`, `original_*`) и в аудите.
|
||||
- Производные консолидации в работе (сводная ОСВ, пары ВГО, шахматка) **не хранятся** — считаются запросом. Хранятся только ручные решения (корректировки, гудвилл, подтверждение КФО клиента).
|
||||
- При верификации всё замораживается в Единое хранилище (ЕХ) как самодостаточный срез, который не зависит от таблиц консолидации.
|
||||
- Единственный писатель в БД — ядро `arm-core`; сервисы распознавания видят только NATS и S3.
|
||||
- Права — данные (`role_permission`), ограничения по ЗО/филиалу/статусу — policy-слой поверх прав.
|
||||
|
||||
---
|
||||
|
||||
## Часть 01 — Группы компаний, организации, филиалы
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `regional_office` | Филиал банка: головной офис (ГО, `is_head_office`) и региональные филиалы (РФ). Определяет зону видимости пользователя и закрепление ГК. | ← `company_group.base_regional_office_id`, `legal_entity.regional_office_id`, `app_user.regional_office_id` | ТЗ 8.1 |
|
||||
| `company_group` | Группа компаний (ГК) — верхний уровень справочника клиентов. Текущее состояние (SCD4). `crm_id` = «iD ГК» из ЕЦП CRM (NULL, если создана вручную Куратором; v5.14 — семантика по выгрузке), внутренний `code`, закрепление за филиалом (`base_regional_office_id` = «Базовый РФ ГК в CRM»), флаг архива. | → `regional_office`; ← `legal_entity`, `related_group`, `consolidation` | ТЗ 6.1, Прил. 2; макет |
|
||||
| `company_group_history` | Прошлые снимки ГК: каждое изменение — новая строка с `valid_from/valid_to`. | → `company_group` | ТЗ 6.10, 8.2 |
|
||||
| `legal_entity` | Юридическое лицо / ИП. Натуральный ключ — ИНН; **v5.17:** `kpp` — КПП (9 символов, nullable, только у ЮЛ, не ключ). `company_group_id` = текущая ГК; **NULL = монозаёмщик**. `close_date` — закрыто/архивировано. | → `company_group`, `regional_office`; ← `related_group_member`, `stored_file`, `document`, `osv_entry.counterparty_id`, `consolidation_member` | ТЗ 6.1, Прил. 2; ЕХ 6.1 |
|
||||
| `legal_entity_history` | Прошлые снимки ЮЛ + вид события (создание, изменение, переход в другую ГК, закрытие, вывод из ГК) и дата вступления в силу. | → `legal_entity` | ТЗ 8.2; макет |
|
||||
| `legal_entity_alias` | Словарь написаний контрагента: как имя встречается в ОСВ и нормализованный ключ для матчинга. Пополняется при ручном сопоставлении. | → `legal_entity` | ТЗ 6.5 |
|
||||
| `related_group` | ГСК или ГСЗ внутри ГК; `kind` различает. Для ГСК формируется КФО. Иерархия не поддерживается. **v5.19:** `crm_id` — ID группы в ЕЦП CRM (вручную, уникален). | → `company_group`; ← `related_group_member`, `consolidation.related_group_id` | ТЗ 6.1, Прил. 2 |
|
||||
| `related_group_member` | Состав ГСК/ГСЗ — история членства (SCD2). **v5.14:** ЮЛ может одновременно входить в **одну ГСК и одну ГСЗ** (не более одной группы каждого вида): колонка `kind` = `related_group.kind` (денормализация) и частичный уникальный индекс `(legal_entity_id, kind) WHERE is_current`. Решение владельца 04.10.2026, отменяет ANL-030. | → `related_group`, `legal_entity` | ТЗ 6.1; макет [79] |
|
||||
|
||||
## Часть 02 — Пользователи, роли, права
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `app_user` | Пользователь АРМ. Аутентификация внешняя (РАИСА/SSO, `external_id`). Филиал (ГО/РФ), зона ответственности (ДКБ/ДМСБ/ДМ), табельный номер. Видимость данных = права роли + филиал + ЗО. | → `regional_office`; ← `user_role`, все `*_by` поля | ТЗ 8.1, Прил. 2 |
|
||||
| `role` | Роли: seed из ТЗ 8.1 (КА РФ, КА ГО, РКА, КМ, Куратор ГО, Эксперт, Администратор; `is_system`) + роли, заведённые администратором для исключений. **v5.13:** код роли в бизнес-логике не проверяется — только права. | ← `user_role`, `role_permission` | ТЗ 8.1 |
|
||||
| `permission` | **v5.13.** Атомарное право «объект × действие»: `DIRECTORY/DOCUMENT/CONSOLIDATION/KFO/EX/EXPORT/USERS/AUDIT` × `VIEW/EDIT/APPROVE/VERIFY/DELETE/EXPORT/ADMIN`. Seed, привязан к коду — администратор новые коды не создаёт. Право говорит «может»; policy-слой (ЗО, филиал, статус КФО) — «эту ли и сейчас ли». | ← `role_permission` | ТЗ Прил. 2, сноска 29 |
|
||||
| `role_permission` | **v5.13.** Матрица доступов как данные: `effective_permissions(user) = ∪ permissions(roles(user))`. Редактируется администратором на экране «Изменение ролей и прав доступа»; история — `audit_event(ROLE_PERMISSION_CHANGE)`. Прямых прав у пользователя нет. | → `role`, `permission` | ТЗ Прил. 2; макет |
|
||||
| `user_role` | Назначение ролей пользователю (M:N). История — в аудите. | → `app_user`, `role` | ТЗ 8.1 |
|
||||
|
||||
## Часть 03 — Бухгалтерские справочники и правила
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `chart_of_account` | План счетов с иерархией, тип A/P/AP, признак забалансового. Seed — полный план 1С; нестандартные субсчета клиентов добавляет администратор. | ← `osv_entry.account_id`, `elimination_rule_account`, `required_document_rule` | ТЗ 6.2/6.5, Прил. 3/4 |
|
||||
| `elimination_rule` | Правило элиминации из Прил. 3 (ББ) / Прил. 4 (ОФР) как данные: пара статей, сторона, мера, режим, НДС, акцизы. Версионируется. | ← `elimination_rule_account`, `correction.rule_id`; версия фиксируется в `consolidation_version` | ТЗ 6.4, Прил. 3/4 |
|
||||
| `elimination_rule_account` | Счета/субсчета каждой стороны правила, включая исключения («76 кроме 76.7.1»). | → `elimination_rule`, `chart_of_account` | ТЗ Прил. 3/4 |
|
||||
| `required_document_rule` | Какие документы обязательны по подходу. **v5.13:** сверяется с `document` (тип + счёт + период), а не с файлом: выполнено = есть `document CONFIRMED` у каждого ЮЛ периметра. | → `chart_of_account` | ТЗ 5.1, 6.2, сноска 12 |
|
||||
|
||||
## Часть 04 — Файлы, документы, S3, задания распознавания
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `s3_object` | Реестр всех объектов в S3: бакет-роль, ключ, размер, sha256, срок жизни, ссылка на архив в data lake. Единая точка ретеншна (5 лет по ТЗ 8.4) и дедупа. | ← `stored_file`, `recognition_job` | ТЗ 6.2, 8.4; ЕХ 8.3 |
|
||||
| `stored_file` | **v5.13: только физический файл** одной загрузки: чей (ЮЛ), формат, hash, кто/когда загрузил, статус обработки (`UPLOADED → PROCESSING → PROCESSED / ERROR / SUPERSEDED`), версия при замене. **v5.18:** `consolidation_id` — консолидация, в контексте которой файл загружен (основа «рабочего стола консоли», общего для версий периода; полный состав — `context/05-domain-rules.md` §9.5 п. 11; `NULL` — без контекста). Что внутри файла — `document`. Замена — файл целиком со всеми документами. | → `legal_entity`, `consolidation`, `s3_object`, `recognition_job`; ← `document`, `recognition_job` | ТЗ 6.2, 8.2; UC-01…05 |
|
||||
| `document` | **v5.13, новая.** Логический документ внутри файла: ББ, ОФР, ОСВ по счёту (`osv_account_code`), расшифровка, прочее. Период, отчётная дата, где в файле (`locator`: лист / страницы), статус проверки (`RECOGNIZED / NEEDS_CHECK / CONFIRMED / ERROR`), результаты проверок периода и контрагента, кто подтвердил. Один файл → N документов (PDF с ББ+ОФР; xlsx с несколькими ОСВ). Создаёт ядро при маппинге результата `recognition_job`. На документ ссылаются разобранные данные, чек-лист, консолидация и ЕХ. **v5.19:** `file_ordinal` — номер документа в результате; формы ББ/ОФР одного типа в файле могут повторяться (ОСВ по счёту, расшифровка, прочий — один на тип); предупреждения и нарушения — `document_issue`. | → `stored_file`, `legal_entity`, `app_user`; ← `osv_entry`, `financial_statement_meta`, `document_issue`, `consolidation_document`, `ex_snapshot_item` | ТЗ 6.2, 5.1, 8.2; макет (чек-лист, «Подтвердить данные») |
|
||||
| `recognition_job` | Одна попытка распознать/распарсить файл. **Единственная точка обмена с NATS** (outbox/inbox, дедуп по `result_msg_id`, DLQ). Хранит сервис и версию, **одну** ссылку на нормализованный JSON-результат в S3 (v5.13), метрики, и **схему группировок шапки ОСВ по листам** (`group_schema jsonb`, v5.13 — вместо `osv_group_schema`). **v5.19:** `statements_version` — версия копии общего кода нормализации, которой посчитан результат форм. | → `stored_file`, `s3_object`; ← `osv_entry`, `financial_statement_meta` | ТЗ 6.2, 6.10; DECISION-4 |
|
||||
|
||||
## Часть 05 — Разобранные ОСВ
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `osv_entry` | Строка ОСВ: документ (счёт + период), владелец, тип строки по схеме шапки (`group_type`, v5.13), уровень и родитель (`parent_entry_id` — **открыт вопрос, замечание 2**), код счёта и резолв в план счетов, сырое имя/ИНН контрагента, резолв в ЮЛ и способ сопоставления (`counterparty_match_kind`, v5.16), шесть сумм, тип данных (БУ/валюта/кол-во), «подакцизный» для 90-го. Ручные правки: `is_modified`, `original_values`, `modified_by`. Признак ГСК/ГК/Внешний не хранится — выводится из периметра версии; способ сопоставления контрагента хранится (`NULL` ⇔ контрагент не сопоставлен). | → `document`, `recognition_job`, `legal_entity` ×2, `chart_of_account` | ТЗ 6.2/6.5, Прил. 2; «Парсинг ОСВ» |
|
||||
|
||||
## Часть 06 — Распознанные формы ББ/ОФР
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `financial_statement_meta` | Шапка распознанной формы (1:1 с `document` BALANCE/INCOME): ИНН и наименование как в документе, отчётная дата, единица измерения, реквизиты. Ревью формы (`reviewed_by/at`) и акцепт КА непройденных логических проверок с комментарием. Подтверждение документа — `document.confirmed_by`. **v5.19:** `form_variant` (полная / упрощённая — набор соотношений §7), `needs_review_fields`; результат проверок §7 и предупреждения хранятся в `document_issue` как пришли от сервиса, ядро пересчитывает их только после правок. | → `document`, `recognition_job`, `app_user`; ← `column`, `line` | ТЗ 6.2/6.3; FNR01; макет |
|
||||
| `financial_statement_column` | Колонки-периоды формы с датой — нужны для межформенной проверки (1370 на начало года) и гудвилла. **v5.19:** `period_kind` (абсолютная / относительная подпись бланка / без даты), `label_confidence`. | → `meta`; ← `value` | ТЗ 6.3 п.7, 6.7 |
|
||||
| `financial_statement_line` | Строка формы как в источнике: код (или его сырой текст) и наименование как распознано. **v5.19:** все строки источника — с кодом (`ok`, повторы кода тоже) и без (`unreadable`, `missing`, `detail` — расшифровка под родителем `parent_row_index`); порядок `row_index`, положение `source_ref`, `needs_review` неуверенного кода, подтверждение кода `is_confirmed`. Раскладка экрана — по коду «как на бумаге». | → `meta`; ← `value`, `document_issue.line_ids` | ТЗ 6.2, Прил. 2 |
|
||||
| `financial_statement_value` | Число в ячейке (строка × колонка): сумма, уверенность, `is_recognized`, ручная правка с исходным значением. **v5.19:** подсветка — только `needs_review` (хранится: уверенность, `is_recognized` и §7 сведены сервисом, ядро пересчитывает после правок); `source_text` — сырой текст источника; `is_confirmed` / `confirmed_by/at` — подтверждено без правки. (v5.13 этот флаг убирала как производный.) | → `line`, `column`, `app_user` | ТЗ 6.2, Прил. 2 |
|
||||
| `document_issue` | **v5.19, новая.** Предупреждение или нарушение §7 документа формы: вид (`warning` / `relation` / `soft`), код и уровень (`error` / `info`), сообщение, привязка к строкам (`line_ids`), колонке и полю шапки, источник (`service` / `core`); для нарушения — соотношение, `expected`, `actual`. Экран показывает их у места. | → `document`, `financial_statement_column` | change `unified-statement-normalization` (design, шаг 8) |
|
||||
|
||||
## Часть 07 — Консолидация
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `consolidation` | Логическая консолидация: **ГК** + отчётный период. ГСК фиксируется/создаётся при верификации по фактическому периметру. Уникальна по (ГК, год, квартал). **v5.18:** файлы, загруженные в консолидацию, — `stored_file.consolidation_id` (основа рабочего стола, общего для версий периода; полный состав — `context/05-domain-rules.md` §9.5 п. 11). | → `company_group`, `related_group`; ← `consolidation_version`, `stored_file` | ТЗ 6.10, 7.2 |
|
||||
| `consolidation_version` | Версия консолидации: номер, статус, сценарий, подход, гудвилл, инициатор и его офис (маршрут), кто утвердил / верифицировал, решение УОБ, отклонения от Методики, версия правил элиминации, ссылка на предыдущую. После VERIFIED — read-only. | → `consolidation`, `app_user`, `regional_office`, self; ← всё в частях 07–08 | ТЗ 5.1, 6.4, 6.10; макет |
|
||||
| `consolidation_status_history` | Каждый переход статуса: из → в, кто, когда, комментарий (обязателен при возврате). | → `consolidation_version`, `app_user` | ТЗ 6.10, 8.2 |
|
||||
| `consolidation_lock` | «Взять в работу»: кто редактирует версию, перехват с причиной (v5.16: без истечения по времени, OQ-119). Из макета — ANL-036. | → `consolidation_version`, `app_user` | макет |
|
||||
| `consolidation_member` | Периметр версии — зафиксированный список ЮЛ; `is_head_entity` для гудвилла. | → `consolidation_version`, `legal_entity` | ТЗ 6.1, 6.10 |
|
||||
| `consolidation_document` | **v5.13:** какие **документы** (не файлы) участвуют в версии. Чек-лист = `required_document_rule` × периметр − `consolidation_document`. Переиспользование одного документа в нескольких версиях/периодах, монозаёмщики из ЕХ. | → `consolidation_version`, `document` | ТЗ Прил. 2; ЕХ 7 |
|
||||
|
||||
*Не хранятся (DECISION-5), считаются запросом по версии:* сводная ОСВ, признак контрагента ГСК/ГК/Внешний, пары ВГО, шахматка, результирующая таблица ВГО.
|
||||
|
||||
## Часть 08 — Корректировки, гудвилл, результат КФО
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `correction` | Ручная корректировка ВГО: пара (правило + компания 1 + компания 2 — естественный ключ), ББ/ОФР, строки и суммы по Дт и Кт, дочерние строки для распределения, причина, обязательный комментарий, статус, номер версии (история — в аудите). КФО = свод − Σ корректировок. | → `consolidation_version`, `elimination_rule`, `legal_entity` ×2, `chart_of_account` ×2, self | ТЗ 6.4, 6.8, Прил. 9 |
|
||||
| `goodwill` | Строка расчёта гудвилла: головная × дочерняя, доля владения, ФВ по 58.01, УК (1310) и добавочный капитал (1350 — вопрос методологам), гудвилл, «включить в КФО», комментарий. | → `consolidation_version`, `legal_entity` ×2, `app_user` | ТЗ 6.7, Прил. 3 п.2, Прил. 8 |
|
||||
| `kfo_result` | Шапка результата КФО: когда посчитан, заморожен ли, ЧА и ВБ, выручка, прибыль, расхождения, пороги, обоснование, итог гудвилла. | → `consolidation_version` (1:1); ← `kfo_result_line` | ТЗ 6.4, 6.8, Прил. 10 |
|
||||
| `kfo_result_line` | Строка консолидированного ББ/ОФР по коду ФСБУ 4/2023: сумма → авто-элиминация → корректировки → гудвилл → итог; «в т.ч. ВГО», источник, расхождение, комментарий. | → `kfo_result`; ← `kfo_result_line_company` | ТЗ 6.4, Прил. 10; макет |
|
||||
| `kfo_result_line_company` | Разрез строки КФО по компаниям периметра: сумма и доля. | → `kfo_result_line`, `legal_entity` | ЕХ 6.6; макет |
|
||||
| `client_kfo_line` | Сценарий «подтверждение КФО клиента»: по строке — значение и ВГО от клиента (ручной ввод), значение и ВГО банка, расхождение, причина. | → `consolidation_version`, `app_user` | ТЗ 5.1, 6.10; макет |
|
||||
|
||||
## Часть 09 — Комментарии, аудит, Единое хранилище
|
||||
|
||||
| Сущность | Что это | Ключевые связи | Откуда |
|
||||
|---|---|---|---|
|
||||
| `comment` | Полиморфный комментарий к объекту (документу, ячейке шахматки по ключу пары, строке КФО). | → `app_user`; `object_type + object_id` без FK | ТЗ 6.3/6.4; макет |
|
||||
| `audit_event` | Журнал действий (append-only): кто, когда, действие, раздел, объект, версия консолидации, before/after, результат, IP/браузер. Покрывает историю правок распознанных данных, корректировок, выгрузок, импорта справочников, входов, **изменений матрицы прав** (v5.13), подтверждения документов, **изменений ЮЛ и пользователей** (v5.14: `LEGAL_ENTITY_CHANGE`, `USER_CHANGE`). | → `app_user`, `consolidation_version` | ТЗ 8.2, Прил. 2; макет |
|
||||
| `ex_snapshot` | Срез ЕХ: одна ГСК на одну отчётную дату, версия, статус (актуальный/архив), когда и кем верифицирован и записан. Самодостаточен — на консолидацию ссылается только данными. | → `related_group`, `company_group`, `app_user`, self; ← `member`, `item` | ЕХ ТЗ 6.2, 6.4, 5.3 |
|
||||
| `ex_snapshot_member` | Периметр среза на дату: ЮЛ с ИНН и наименованием на момент верификации. | → `ex_snapshot`, `legal_entity` | ЕХ ТЗ 6.3 |
|
||||
| `ex_snapshot_item` | Содержимое среза. Два вида: исходный документ → ссылка на **`document`** (v5.13; скачать — через его файл) и всё производное → `payload` jsonb. | → `ex_snapshot`, `document`, `legal_entity` | ЕХ ТЗ 5.2, 6.7 |
|
||||
|
||||
---
|
||||
|
||||
## Как читать модель по сценарию «сформировать КФО»
|
||||
|
||||
1. **Справочники** (01–03): ГК → ЮЛ → ГСК/ГСЗ; план счетов; правила элиминации; что обязательно загрузить.
|
||||
2. **Создание консолидации** (07): `consolidation` от ГК + период → `consolidation_version` → `consolidation_member` (периметр).
|
||||
3. **Загрузка** (04): `stored_file` + `s3_object` → `recognition_job` (queued → NATS → сервис → результат в S3 → done) → ядро создаёт **`document`** на каждый ББ / ОФР / ОСВ по счёту, найденный в файле.
|
||||
4. **Разбор** (05–06): ОСВ → `osv_entry`; ББ/ОФР → `financial_statement_meta/column/line/value`. Аналитик проверяет, правит, подтверждает **документ**; логические проверки — на лету; сопоставляет контрагентов (→ `osv_entry.counterparty_id`, `legal_entity_alias`). Чек-лист закрывается по `document CONFIRMED`.
|
||||
5. **Консолидация** (вычисляется): сводная ОСВ, пары ВГО, шахматка — из `osv_entry` × периметр × правила. Аналитик вносит `correction`, заполняет `goodwill`, при сценарии подтверждения — `client_kfo_line`. Результат — `kfo_result(_line)`.
|
||||
6. **Согласование** (07): `consolidation_status_history` по маршруту; блокировка `consolidation_lock`. Что можно — решает `role_permission` + policy-слой по статусу/ЗО.
|
||||
7. **Верификация → ЕХ** (09): `ex_snapshot` + `member` + `item` (документы по ссылке, остальное — payload). Версия → read-only. Всё это время — `audit_event`.
|
||||
|
||||
## Открытые вопросы после v5.14
|
||||
|
||||
- **Замечание 2** (`osv_entry.parent_entry_id`, какие строки ОСВ хранить) — отложено; затрагивает и аналитику «Парсинг ОСВ» п.11.
|
||||
- Замена по-документно (одна ОСВ из файла с пятью) — сейчас не предусмотрена, замена файлом целиком. Если понадобится — `superseded_by` переезжает в `document`.
|
||||
- Статус `document.RECOGNIZED` (ручная проверка не требуется по порогу) — подтвердить с аналитиками, нужен ли, или все документы проходят через `NEEDS_CHECK → CONFIRMED`.
|
||||
@ -1,12 +1,12 @@
|
||||
schema: spec-driven
|
||||
|
||||
context: |
|
||||
Репозиторий arm-ka-docs — контекст, модель данных (DBML v5.18), правила домена, контракты между сервисами
|
||||
Репозиторий arm-ka-docs — контекст, модель данных (DBML v5.19), правила домена, контракты между сервисами
|
||||
(docs/contracts/*.schema.json), макет UI и экспорт ТЗ системы АРМ КА (ДКБ, Россельхозбанк).
|
||||
Здесь оформляются СКВОЗНЫЕ изменения: контракт + окружение разработки (docs/dev) + проверки качества (make check) + изменения
|
||||
документов контекста. Код сервисов живёт в соседних репозиториях (../arm-core, ../tabular-parser, ../scan-gateway),
|
||||
у каждого свой openspec/ и свой change; сквозной change ссылается на них.
|
||||
Источники истины по приоритету: docs/model/data-model-v5.18.dbml → docs/model/entities-v5.18.md →
|
||||
Источники истины по приоритету: docs/model/data-model-v5.19.dbml → docs/model/entities-v5.19.md →
|
||||
docs/context/05-domain-rules.md → docs/source/tz (черновик, имена v4). Открытые вопросы — docs/context/07-open-questions.md;
|
||||
план срезов — docs/context/09-delivery-plan.md; соглашения шаблона команды — docs/context/03-architecture.md.
|
||||
Язык документов и коммитов — русский, идентификаторы — английские, как в DBML. docs/source/** не редактируется.
|
||||
|
||||
@ -16,7 +16,7 @@
|
||||
- NATS subjects и схема ключей S3 — `../docs/context/03-architecture.md`.
|
||||
|
||||
## Правила репозитория
|
||||
- ORM 1:1 с `../docs/model/data-model-v5.18.dbml`; `scripts/check_dbml_vs_orm.py` — обязательная проверка CI.
|
||||
- ORM 1:1 с `../docs/model/data-model-v5.19.dbml`; `scripts/check_dbml_vs_orm.py` — обязательная проверка CI.
|
||||
- Алгоритмы — только из `../docs/context/05-domain-rules.md`; номер § — в docstring.
|
||||
- Вычисляемые объекты консолидации — `backend/app/domain/`, без ORM-таблиц.
|
||||
- Фронт: пользователь слаб во фронте — для TS/React изменений делай ревью сам и объясняй решения в PR.
|
||||
|
||||
@ -37,7 +37,13 @@ PARTS = {
|
||||
"05_osv_parsed": ("Разобранные ОСВ", ["osv_entry"]),
|
||||
"06_statements": (
|
||||
"Распознанные формы ББ/ОФР и логические проверки",
|
||||
["financial_statement_meta", "financial_statement_column", "financial_statement_line", "financial_statement_value"],
|
||||
[
|
||||
"financial_statement_meta",
|
||||
"financial_statement_column",
|
||||
"financial_statement_line",
|
||||
"financial_statement_value",
|
||||
"document_issue",
|
||||
],
|
||||
),
|
||||
"07_consolidation": (
|
||||
"Консолидация: версии, статусы, периметр, документы, блокировка",
|
||||
|
||||