From 2b3ead461ad751918737e3c7e88625d8b6837e6a Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 9 Oct 2026 12:31:35 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B2=D1=81=D1=82=D0=B0=D0=B2=D0=BA=D1=83?= =?UTF-8?q?=20=D0=B2=20=C2=A711=20=D0=B8=20=D1=81=D0=B8=D0=B3=D0=BD=D0=B0?= =?UTF-8?q?=D1=82=D1=83=D1=80=D1=8B=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B0=203b=20(#81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M-7: вставка про достройку строк разорвала перечисление в 05-domain-rules.md §11, вынесена отдельным предложением. M-8: в api-contract-slice-3b.md у LineOut/ValueOut добавлены id | null и origin, у StatementPatch.values - line_id | line_code. Co-Authored-By: Claude Sonnet 5.5 --- context/05-domain-rules.md | 3 ++- dev/api-contract-slice-3b.md | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index cf9f316..39743bd 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -882,7 +882,8 @@ PDF-пути, решение №1 спеки 3a; `pages:…` — только е (ИНН, имя, units, report_date, okud — из `organization/inn/units/date.form_name`, с низкой уверенностью → `NEEDS_CHECK`) + `financial_statement_column` (из шапки `rows[0]`, если она есть; `period_date` распарсить из «На 30 июня 2025 г», `is_current` = первая; без шапки — колонки без дат, документ `NEEDS_CHECK`) + `financial_statement_line` (`cells[1]` код, `cells[0]` имя; -только строки с кодом); недостающие строки формы ядро достраивает на экране по справочнику редакции, §7 + `financial_statement_value` (число: убрать пробелы/`-`, скобки → минус; `confidence`; `is_recognized`). +только строки с кодом) + `financial_statement_value` (число: убрать пробелы/`-`, скобки → минус; `confidence`; `is_recognized`). +Недостающие строки формы ядро достраивает на экране по справочнику редакции (§7, arm-core#80). Сверки: ИНН/имя vs `legal_entity` → `document.counterparty_check`; дата vs период версии → `period_check`. ### §11.1 Очистка OCR-текста (перенос из старого ядра, Срез 3) diff --git a/dev/api-contract-slice-3b.md b/dev/api-contract-slice-3b.md index 76c277b..79ece02 100644 --- a/dev/api-contract-slice-3b.md +++ b/dev/api-contract-slice-3b.md @@ -65,8 +65,8 @@ D-1…D-14, «Decisions made without discussion» №1–№22). Правила `address` (все `| null`). - `columns[]` — `ColumnOut {id, column_index, label | null, period_date | null, is_current | null}`; `is_current = true` у колонки с самой поздней датой. -- `lines[]` — по коду строки (по возрастанию `line_code`): `LineOut {id, line_code | null, line_code_confidence | null, line_name | - null, line_name_confidence | null, values[]}`; `values[]` — по одной записи на **каждую** колонку формы (`ValueOut {id, column_id, +- `lines[]` — по коду строки (по возрастанию `line_code`): `LineOut {id | null, origin: 'source' | 'template', line_code | null, line_code_confidence | null, line_name | + null, line_name_confidence | null, values[]}`; `values[]` — по одной записи на **каждую** колонку формы (`ValueOut {id | null, column_id, column_index, amount | null, string_value | null, confidence | null, is_recognized | null, is_modified, original_amount | null, modified_by | null, modified_at | null}`). `amount` — текущее значение (после правок); `original_amount` заполняется с первой правки; `string_value` — неразобранный текст ячейки (когда `amount` пуст). @@ -74,7 +74,7 @@ D-1…D-14, «Decisions made without discussion» №1–№22). Правила expected, actual}` (`relation` — читаемая запись соотношения, `expected` и `actual` — суммы строками; `column_index = -1` — у межформенной проверки колонки нет); `accepted` — `{by, at, comment}` (в коде схема `ChecksAcceptedOut`) или `null`. -**`StatementPatch`** `{header?: {inn?, report_date?, units?}, values?: [{line_id, column_id, amount}]}` — частичное тело, лишние поля +**`StatementPatch`** `{header?: {inn?, report_date?, units?}, values?: [{line_id | line_code, column_id, amount}]}` — частичное тело, лишние поля запрещены (422). `header.inn` — строка из 10 или 12 цифр (любое другое значение, включая `null`, — 422 `INVALID_INN`: ИНН очистить нельзя); `header.report_date` — дата, `null` очищает; `header.units` — непустая строка после обрезки пробелов, ≤ 50 (`null` — «не менять», единицы очистить нельзя; пробельная строка — 422 pydantic-массивом). Поле шапки, которого нет в теле, не меняется. `values` — до 5000 ячеек: `{line_id | line_code, column_id, amount}` (ровно одно из `line_id`/`line_code`); одна ячейка дважды в запросе — 422 `DUPLICATE_CELL`; `line_id`/`column_id` не этого документа — 422 `UNKNOWN_CELL`. **Полный состав формы (arm-core#80):** в `StatementOut` `lines[].origin` (`source` | `template`), у достроенных по справочнику редакции строк и ячеек `id = null`; `line_code` создаёт строку (`line_code_original_value = NULL`) при первой непустой сумме. Новые случаи `UNKNOWN_CELL`: код уже есть в форме (передайте `line_id`), код вне справочника, нет редакции. **`ChecksAcceptIn`** `{comment}`.