Andrey Epifancev 62807813ab openspec: архив intercompany-matrix (#114)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 15:59:40 +04:00

5.4 KiB
Raw Blame History

Context

Реализация — PR RSHB/arm-core#114 (AURORA-1537). Шахматка — чистая функция от сводной ОСВ версии, периметра и выбранных счетов; в БД не хранится (инвариант «производные консолидации не хранятся», DECISION-5).

Decisions

  1. Матрица считается поверх ConsolidatedOsvService.build_with_members (бывший приватный _build): строки свода и участники периметра берутся из того же расчёта, что и сводная ОСВ; в SourceRow/ConsolidatedRow добавлено account_id.
  2. Пара (A, B): сторона 1 — дебет ОСВ A по контрагенту B, сторона 2 — кредит ОСВ B по контрагенту A. Расчёт поддерживает показатели closing/turnover, но в режимах ALL и MANUAL всегда используется конечное сальдо (closing).
  3. Режим ALL берёт все счета вида A/AP (дебет) и P/AP (кредит); MANUAL раскрывает выбранные счета по иерархии chart_of_account и фильтрует по виду.
  4. Порог расхождения 5 % проверяется по точному значению до округления; суммы в JSON — десятичные строки с двумя знаками (ROUND_HALF_UP).
  5. Строки пары без account_id в суммы не входят и считаются в skipped_osv_entry_count.
  6. Результирующая таблица — пять фиксированных статей (RESULT_ARTICLES) со списками кодов счетов и исключений; отсутствие любого кода в плане счетов — 422 RESULT_ACCOUNTS_MISSING.
  7. xlsx: имя файла intercompany-matrix_<ГК>_<год>-<квартал>_v<n>.xlsx; каждая выгрузка пишет собственное событие audit_event(EXPORT).
  8. Сверка с эталоном «Русский бисквит» — только по точным парам счетов и компаний; общая сумма элиминации эталона не приравнивается к минимуму по паре (решение владельца 08.10.2026).

Known issues

Требования ниже описывают текущее поведение; дефекты вынесены в задачи Jira и в этом change не исправляются.

  • AURORA-1651: one_sided считается по наличию исходных записей, а не по суммам и строкам-основаниям — пара «100 млн против строки с нулевым сальдо» не подсвечивается, «0 против 0» подсвечивается ложно; подсветка таких пар в xlsx; режим ALL захватывает забалансовые счета 001–012.
  • AURORA-1652: GET …/elimination-rules пуст до задачи 1536, хотя требование описывает непустой ответ; формат сумм результирующей таблицы "0" вместо "0.00" (расхождение с форматом матрицы); ссылки на §§ в docstring; ссылка README на гайд фронта.
  • AURORA-1653: переход «ячейка → сводная ОСВ» — фильтр по паре в GET …/osv; osv_entry_ids_* содержат ID нулевых строк и не отсортированы.

Decisions made without discussion

  • 16.10.2026. Требования автора перенесены из openspec/specs/* в дельты ADDED дословно, без правки содержания. Обоснование: владелец поручил оформить change процессно, а содержательные замечания ревью уже вынесены в задачи. Цена ошибки: низкая — текст можно поправить в этом же change'е до архивации.
  • 16.10.2026. Спека фиксирует текущее поведение, включая семантику one_sided и формат "0" результирующей таблицы; исправление требований идёт вместе с кодом в AURORA-1651/1652/1653 (там же MODIFIED-дельты). Обоснование: иначе спека разойдётся с кодом PR. Цена ошибки: до исправления спека описывает известные дефекты (отмечены в ## Known issues).
  • 16.10.2026. Все требования оформлены как ADDED в существующих capability, новая capability не заводится. Обоснование: шахматка — отчёт по сводной ОСВ (consolidated-osv), API версий (consolidations-api), справочников и аудита; отдельная capability дробила бы уже согласованную структуру. Цена ошибки: низкая, перенос между capability — правка путей дельт.