From dfccabcadacec0626768e7fab05310f2c79cd931 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 27 Oct 2026 19:33:16 +0400 Subject: [PATCH] =?UTF-8?q?docs(counter-pairs):=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20(=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=B0=D0=BA=D1=82=20=D1=81=D0=BB=D0=B0=D0=B9?= =?UTF-8?q?=D1=81=D0=B0=204,=20=C2=A73=20=D0=BF.=209,=20=D0=BF=D1=83=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- context/05-domain-rules.md | 1 + context/10-user-journey.md | 2 +- dev/api-contract-slice-4.md | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index d7b49c5..0fb34de 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -567,6 +567,7 @@ closing_* = closing_* строки Qn по-прежнему считаются «Внешний» (п. 5; AURORA-1388, AURORA-1865). Закрывается ручным сопоставлением (см. выше). Строки Б, у которых ИНН в файле есть, но его нет в справочнике, сопоставления не требуют и в `missing_unmapped_rows` не входят — отдельная задача AURORA-1866. + --- ## §4. Правила элиминации — пары счетов (Прил. 3 ТЗ, DOC-223044, FNR03) diff --git a/context/10-user-journey.md b/context/10-user-journey.md index 6ce303c..21d747e 100644 --- a/context/10-user-journey.md +++ b/context/10-user-journey.md @@ -90,7 +90,7 @@ | Шаг | Вкладка | Действие | БД | |---|---|---|---| -| 3.1 | **ОСВ** [30] | сводная ОСВ: Компания ГК, Счёт, Период, Контрагенты, ИНН, 6 сумм, Тип контрагента. Баннер «Есть организации без ИНН и без сопоставления… Осталось: N. Несопоставленные учитываются как внешние» (переход не блокируется; AURORA-1865) → **Показать ЮЛ без ИНН** [32-osv-no-inn] → **Указать** (только у строки без сопоставленного ЮЛ и без ИНН; у строки, сопоставленной без ИНН в файле, в колонке ИНН — ИНН ЮЛ справочника, по клику — пересопоставление) → модалка «Выбор организации для связи с …» [32-osv-map-counterparty]: ИНН, Организация, ГК, ГСК, ГСЗ, блок «Рекомендуемые», **Связать**. Над сводом переключатель «Свод | Встречные записи (N)» (`?view=pairs`): слева пары участников без встречных записей «Б ← А» (§3 п. 9), в центре строки А с контрагентом Б, справа строки Б без ИНН и сопоставления с «Указать» (та же модалка). При уходе с вкладки, если есть пары, — модалка «Проверьте встречные записи участников» («Нет встречных записей: N пар у M участников…»; **Показать пары** / **Остаться** / **Перейти**) вместо [31-00]; показывается один раз на список пар за сессию браузера, без пар не показывается (AURORA-1746). **API:** `GET …/versions/{id}/osv` (фильтры, `limit` ≤ 2000), `…/osv/summary` (`counter_pairs[]`, `?counterparty_id=` у строк пары; баннер «Осталось: N» и «Показать ЮЛ без ИНН» — `unmapped_total` / `?unmapped=true`: строки без сопоставленного ЮЛ и без ИНН из файла — решение владельца 08.10.2026, отмена П-1 от 07.10.2026; ИНН сопоставленного ЮЛ — `counterparty_entity_inn`; пробелы — `gaps[]`), `…/counterparty-candidates?scope=&q=&entry_id=` (блок «Рекомендуемые» — `recommended`), `POST …/osv/entries/{entry_id}/counterparty` (**Связать**), `GET …/osv/export` (**Экспорт**, xlsx) | вычисляется; `osv_entry.counterparty_id`, `legal_entity_alias`, `audit_event(OSV_COUNTERPARTY_MAP)` | +| 3.1 | **ОСВ** [30] | сводная ОСВ: Компания ГК, Счёт, Период, Контрагенты, ИНН, 6 сумм, Тип контрагента. Баннер «Есть организации без ИНН и без сопоставления… Осталось: N. Несопоставленные учитываются как внешние» (переход не блокируется; AURORA-1865) → **Показать ЮЛ без ИНН** [32-osv-no-inn] → **Указать** (только у строки без сопоставленного ЮЛ и без ИНН; у строки, сопоставленной без ИНН в файле, в колонке ИНН — ИНН ЮЛ справочника, по клику — пересопоставление) → модалка «Выбор организации для связи с …» [32-osv-map-counterparty]: ИНН, Организация, ГК, ГСК, ГСЗ, блок «Рекомендуемые», **Связать**. Над сводом переключатель «Свод | Встречные записи (N)» (`?view=pairs`): слева пары участников без встречных записей «Б ← А» (§3 п. 9), в центре строки А с контрагентом Б, справа строки Б без ИНН и сопоставления с «Указать» (та же модалка). При уходе с вкладки, если есть пары, — модалка «Проверьте встречные записи участников» («Нет встречных записей: N пар у M участников…»; **Показать пары** / **Остаться** / **Перейти**) вместо [31-00]; показывается один раз на список пар за сессию браузера, без пар не показывается (AURORA-1746). **API:** `GET …/versions/{id}/osv` (фильтры, `limit` ≤ 2000), `…/osv/summary` (`counter_pairs[]`; строки пары — `…/osv?counterparty_id=`; баннер «Осталось: N» и «Показать ЮЛ без ИНН» — `unmapped_total` / `?unmapped=true`: строки без сопоставленного ЮЛ и без ИНН из файла — решение владельца 08.10.2026, отмена П-1 от 07.10.2026; ИНН сопоставленного ЮЛ — `counterparty_entity_inn`; пробелы — `gaps[]`), `…/counterparty-candidates?scope=&q=&entry_id=` (блок «Рекомендуемые» — `recommended`), `POST …/osv/entries/{entry_id}/counterparty` (**Связать**), `GET …/osv/export` (**Экспорт**, xlsx) | вычисляется; `osv_entry.counterparty_id`, `legal_entity_alias`, `audit_event(OSV_COUNTERPARTY_MAP)` | | 3.2 | **Шахматка** [31-01] | фильтры Год, Период, Компании, Дт-счета, Кт-счета; матрица компания × компания: сумма A / сумма B / (расхождение) красным; Итого; ниже результирующая таблица «Статья × компания» | вычисляется (§5–6 правил) | | 3.3 | **Таблица корректировки** [31-02] [31-02-02] | фильтр «Отклонение» (Все); пары «Актив баланса ЮЛ-1 / Пассив баланса ЮЛ-2»: Наименование, Строка баланса, Счёт, Сумма; **Контроль**: % отклонения, Сумма отклонения; **Корректировка**: Строка баланса / Дт, Строка баланса / Кт, Комментарий; строка пары раскрывается в детализацию по субсчетам; Итого. В макете % отклонения считается к сумме стороны ЮЛ-1, а не к меньшей (OQ-35). **Редактировать** [31-02-01] → баннер «Режим редактирования включён…», ячейки пары и корректировки становятся полями ввода, **Отменить изменения** / **Сохранить** | `correction` (+ дочерние строки `parent_correction_id`), `audit_event(CORRECTION_*)`; ≥ 5 % → `ADJUSTMENT` | | 3.4 | **Гудвилл** [31-03] | здесь же включается/выключается расчёт гудвилла для консолидации (`goodwill_enabled`; переключателя в снимках нет — решение OQ-27); фильтр «Гудвилл: Все значения»; по головной организации (с «Выделить все» и строкой «Всего»): Учёт в отчёте ☐, Наименование дочерней организации, Доля владения, Фондовые вложения головной организации, Доля участия головной организации в уставном капитале дочерней организации, Уставный капитал, Гудвилл (+/−), Комментарий; **Редактировать** [31-03-01] → «Доступны для редактирования столбцы „Доля владения“ и „Комментарий“» | `consolidation_version.goodwill_enabled`, `goodwill(ownership_share, include_in_kfo, comment)` | diff --git a/dev/api-contract-slice-4.md b/dev/api-contract-slice-4.md index d707953..0cbe85e 100644 --- a/dev/api-contract-slice-4.md +++ b/dev/api-contract-slice-4.md @@ -92,8 +92,9 @@ warnings[]}` — поля с `?` могут быть `null` (ключ прису (`null`, если ЮЛ не найдено). Для склеенных строк `entry_ids` — записи по кварталам (порядок — от раннего к позднему). **`OsvSummaryOut`** `{rows_total, unmapped_total, auto_matched_total, documents_total, gaps[], counter_pairs[]}`: `rows_total` — число строк свода (без фильтров); `unmapped_total` — число строк свода с пустым `counterparty_id` **после** дорезолва на лету **и** без `counterparty_inn` (то же, что `GET …/osv?unmapped=true` даёт в `total`; `unmapped=false` — все остальные строки); `auto_matched_total` — число строк с `match_kind` `NAME` или `ALIAS` независимо от `match_stored` (`INN`, `MANUAL`, `PROPAGATED` не входят); `documents_total` — число ОСВ-документов, привязанных к версии; **`gaps[]`** — `{legal_entity_id, legal_entity_name, account_code, missing_quarters[]}` (пара ЮЛ × счёт, у которой нет ОСВ за какие-то кварталы; -строк такой пары в своде нет). Баннер «Требуется указать соответствия… Осталось: N», кнопка «Показать ЮЛ без ИНН» [32-osv-no-inn] -и предупреждение [31-00] опираются на `unmapped_total` / `…/osv?unmapped=true`: строки свода без сопоставленного ЮЛ **и** без ИНН +строк такой пары в своде нет). Баннер «Есть организации без ИНН и без сопоставления… Осталось: N» (не блокирует переход) и кнопка «Показать ЮЛ без ИНН» +[32-osv-no-inn] опираются на `unmapped_total` / `…/osv?unmapped=true`; прежнее предупреждение [31-00] заменено модалкой +«Нет встречных записей» по `counter_pairs[]`, `unmapped_total` блокировок и модалок не создаёт. `unmapped_total` — строки свода без сопоставленного ЮЛ **и** без ИНН из файла; строка с ИНН, которого нет в справочнике, сопоставления не требует (решение владельца 08.10.2026, arm-core #74 — отмена П-1 от 07.10.2026). **`CandidateOut`** `{id, inn, name, company_group (Ref | null), gsk (Ref | null), gsz (Ref | null), counterparty_type, recommended}`. **`MapCounterpartyOut`** `{row (ConsolidatedRowOut | null), propagated, alias_created,