From a5527c3f1feef0dc6152347ef4b1ca11b9db0805 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 15 Oct 2026 16:55:26 +0400 Subject: [PATCH 1/2] =?UTF-8?q?docs(=C2=A711.1):=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20=D1=82=D1=8B?= =?UTF-8?q?=D1=81=D1=8F=D1=87=20=D0=B2=20=D1=81=D1=83=D0=BC=D0=BC=D0=B0?= =?UTF-8?q?=D1=85=20OCR=20(AURORA-1405,=20scan-gateway#35)?= 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 | 16 +++++++++++++--- dev/qa-guide.md | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index 69ddd7c..0a220e5 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -1013,7 +1013,8 @@ PDF-пути, решение №1 спеки 3a; `pages:…` — только е `rules/statement_lines.yaml` из §12 — в tabular-parser такого файла нет), а из OCR — только если кода нет в справочнике выбранной редакции (`line_code_confidence < 100`, не выше 99). Код считается распознанным (`line_code_recognized`), если `confidence == 100`, очищенный текст равен сырому и код есть в справочнике. -7. **Суммы** (`_parse_amount`): запятая → точка, пробелы убираются; содержимое скобок — отрицательное; из строки +7. **Суммы** (`_parse_amount`): пробелы убираются; **сначала разделитель тысяч** (см. ниже), затем запятая → точка; + содержимое скобок — отрицательное; из строки удаляется всё, кроме цифр, `+`, `-`, `.`; если точек больше одной, **удаляются все** (запятая уже стала точкой: `1.234,56` → `123456`, дробная часть не сохраняется, `is_recognized = false`); `Decimal`, иначе `None`. Прочерк, «–», «—», пусто — пустое значение (NULL, не 0). `string_value` — текст ячейки как распознан (`\n`/`\t` → пробел), **только если сумма не разобрана** (`amount = null`) и ячейка не пуста и не прочерк (DBML: @@ -1023,9 +1024,18 @@ PDF-пути, решение №1 спеки 3a; `pages:…` — только е «—»/«–» при `confidence = 100` даёт `is_recognized = false` (тире вырезается как «лишний» символ), дефис «-» — `true` (решение №20). Скобки сами `is_recognized` не портят: признак считается до постановки минуса (решение №13; в источнике любая сумма в скобках получала `false`). + **Разделитель тысяч** (AURORA-1405, scan-gateway#35, решение владельца 15.10.2026; отличие от источника, где «4,200» в + PDF означало 4 200, но показывалось как 4,2): если текст ячейки после `strip` и удаления пробелов, с учётом скобок + (берётся содержимое первой пары скобок) и знака, полностью совпадает с `[+-]?[1-9]\d{0,2}(,\d{3})+`, запятые — разделители + тысяч и **удаляются до** замены запятой на точку: `4,200` → 4200, `(4,200)` → −4200, `1,234,567` → 1234567, `-4,200` → + −4200, `+4,200` → 4200. Удаление таких запятых не считается отбрасыванием символов: `is_recognized` определяется только + `confidence == 100`. Остальное без изменений: `4,2` → 4.2, `12,34` → 12.34, `0,125` → 0.125 (далее отсекается решением + №30), `1,23` → 1.23, `1 234,56` → 1234.56, `1.234,56` и `1,234.56` → 123456 (`is_recognized = false`); `12,3456`, + `4,200,` и `(4,200}` шаблону не соответствуют, разбор прежний. **Отличия от источника под контракт** (решение №30 спеки 3a): сумма с **более чем двумя** знаками после запятой - (`1,234`, `0,125`) не укладывается в `Money` контракта (`numeric(18,2)`) — `amount = null`, `string_value` — текст - ячейки, `is_recognized = false` (иначе один артефакт OCR, например пробел тысяч как запятая, валил всю таблицу); + (например `0,125`, `12.3456`) не укладывается в `Money` контракта (`numeric(18,2)`) — `amount = null`, `string_value` — + текст ячейки, `is_recognized = false` (иначе один артефакт OCR валил всю таблицу); `1,234` под это не попадает — + разбирается правилом тысяч выше (= 1234); `confidence` ячейки и полей шапки приводится к диапазону 0–100, NaN → 0. **`is_recognized`** значения = `confidence == 100` **и** разбор суммы не потребовал выбрасывать символы (сырой текст без скобок равен очищенному). Для ячеек шапки: `is_recognized` = `confidence == 100` и в тексте не было мусора; если дата diff --git a/dev/qa-guide.md b/dev/qa-guide.md index e5f5b33..6c0f453 100644 --- a/dev/qa-guide.md +++ b/dev/qa-guide.md @@ -512,7 +512,7 @@ PDF и изображения обрабатывает `scan-gateway`; ядро `Output//` и входящий файл удаляются. Что не считать багом: строки с мусорным или пустым кодом не попадают в документ, но есть предупреждения `строк с нечисловым кодом пропущено` / `строк без кода с суммами пропущено` (OQ-149); при повторе кода остаётся первая строка (OQ-152); минус не поставлен при `}` вместо `)` (OQ-147); `is_recognized = false` у прочерка «—» (OQ-148); сумма -с тремя знаками после запятой (`1,234`) — `amount = null`, текст в `string_value`. +с тремя знаками после запятой (`0,125`) — `amount = null`, текст в `string_value`; `4,200` и `1,234` — разделитель тысяч (4200, 1234). ### 6.9 Формы ББ/ОФР: просмотр, правка, акцепт, подтверждение (Срез 3b) From 3230459f26a6144c76c10d83f84047e790b16500 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 15 Oct 2026 16:58:54 +0400 Subject: [PATCH 2/2] =?UTF-8?q?docs(=C2=A711.1):=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=20=D1=82=D1=8B?= =?UTF-8?q?=D1=81=D1=8F=D1=87=20=E2=80=94=20=D1=83=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BA=D0=BE=D0=B1=D0=BE=D0=BA?= =?UTF-8?q?=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC=D1=83=D0=BB=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0?= 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 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index 0a220e5..901cdfd 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -1025,13 +1025,14 @@ PDF-пути, решение №1 спеки 3a; `pages:…` — только е (решение №20). Скобки сами `is_recognized` не портят: признак считается до постановки минуса (решение №13; в источнике любая сумма в скобках получала `false`). **Разделитель тысяч** (AURORA-1405, scan-gateway#35, решение владельца 15.10.2026; отличие от источника, где «4,200» в - PDF означало 4 200, но показывалось как 4,2): если текст ячейки после `strip` и удаления пробелов, с учётом скобок - (берётся содержимое первой пары скобок) и знака, полностью совпадает с `[+-]?[1-9]\d{0,2}(,\d{3})+`, запятые — разделители + PDF означало 4 200, а в прежнем АРМ показывалось как 4,2; в scan-gateway до этого правила ячейка отсекалась решением №30: + `amount = null`, текст в `string_value`): если текст ячейки после `strip` и удаления пробелов, с учётом скобок + (шаблон применяется к содержимому скобок, только если пара скобок занимает всю строку) и знака, полностью совпадает с `[+-]?[1-9]\d{0,2}(,\d{3})+`, запятые — разделители тысяч и **удаляются до** замены запятой на точку: `4,200` → 4200, `(4,200)` → −4200, `1,234,567` → 1234567, `-4,200` → −4200, `+4,200` → 4200. Удаление таких запятых не считается отбрасыванием символов: `is_recognized` определяется только `confidence == 100`. Остальное без изменений: `4,2` → 4.2, `12,34` → 12.34, `0,125` → 0.125 (далее отсекается решением №30), `1,23` → 1.23, `1 234,56` → 1234.56, `1.234,56` и `1,234.56` → 123456 (`is_recognized = false`); `12,3456`, - `4,200,` и `(4,200}` шаблону не соответствуют, разбор прежний. + `4,200,`, `(4,200}`, `(4,200) руб`, `abc(4,200)` и `(4,200)(1,000)` шаблону не соответствуют, разбор прежний. **Отличия от источника под контракт** (решение №30 спеки 3a): сумма с **более чем двумя** знаками после запятой (например `0,125`, `12.3456`) не укладывается в `Money` контракта (`numeric(18,2)`) — `amount = null`, `string_value` — текст ячейки, `is_recognized = false` (иначе один артефакт OCR валил всю таблицу); `1,234` под это не попадает —