diff --git a/openspec/changes/slice-2a-osv-parser/design.md b/openspec/changes/slice-2a-osv-parser/design.md index 42d4c14..7254444 100644 --- a/openspec/changes/slice-2a-osv-parser/design.md +++ b/openspec/changes/slice-2a-osv-parser/design.md @@ -57,8 +57,8 @@ origin), «Дебет/Кредит» ищутся в следующей стро 60.01`) в `account_code_raw` остаётся как в файле (контракт), нормализованный код — забота ядра; не-счёт → группа по позиции (количество не-счётных предков после последнего ACCOUNT); для COUNTERPARTY `counterparty_name = row_value`, `counterparty_inn` из колонки ИНН (только цифры, 10/12, иначе `null`); строки «Вал.», «Кол.», трёхбуквенные коды валют → -`data_type` CURRENCY/QUANTITY с наследованием сумм в `extra`? — нет: суммы остаются в шести полях, `data_type` помечает -строку, в инвариантах §1.4 такие строки исключаются. Последняя строка level 0 с текстом из словаря «Итого» → `TOTAL`. +`data_type` CURRENCY/QUANTITY; их суммы остаются в шести полях, `data_type` лишь помечает строку, и в инвариантах §1.4 +такие строки исключаются. Последняя строка level 0 с текстом из словаря «Итого» → `TOTAL`. ### D-5. Числа `numbers.to_money(cell) -> Decimal | None`: число → `Decimal(str(value)).quantize(0.01)`; текст → убрать пробелы (в т.ч. diff --git a/openspec/changes/slice-2a-osv-parser/specs/osv-parsing/spec.md b/openspec/changes/slice-2a-osv-parser/specs/osv-parsing/spec.md index bfcddb6..2c8a0eb 100644 --- a/openspec/changes/slice-2a-osv-parser/specs/osv-parsing/spec.md +++ b/openspec/changes/slice-2a-osv-parser/specs/osv-parsing/spec.md @@ -152,8 +152,8 @@ balance_identity_violations, parent_sum_violations}`. Любое нарушен #### Scenario: Пустая ОСВ - **WHEN** разбирается `schastl/2025-Q2/…66 за 2 квартал 2025 г..xlsx` (заголовок и сразу «Итого») -- **THEN** `status = done`, `rows` содержит только строку TOTAL (и строку счёта, если она есть), `metrics.rows = 0` или `1` - по факту файла, предупреждение «нет строк данных» +- **THEN** `status = done`, `rows` содержит только строку TOTAL, `metrics.rows = 0` (строки данных без TOTAL), + `checks.total_row_matches_root = true` (корня нет, суммы TOTAL пусты), предупреждение «нет строк данных» ### Requirement: Форматы, лимиты, время Парсер SHALL читать XLSX (openpyxl, полное чтение), XLS (xlrd, `formatting_info`), XLSB (pyxlsb; outline level недоступен —