Andrey Epifancev d4e1554550 Архив OpenSpec: goodwill-table и goodwill-ui (#222, #220)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:09:43 +04:00

14 KiB
Raw Blame History

goodwill-table Specification

Purpose

Таблица гудвилла позволяет аналитику сохранить долю и обоснование для фактических вложений между компаниями версии и получить проверяемые суммы для последующего расчёта КФО.

Requirements

Requirement: Фактические направленные пары

Система SHALL находить пары ГО→ДО по ненулевой сумме closing_debit счёта 58.01 и его потомков по дереву счетов. Обе компании входят в периметр и различаются; контрагент сопоставлен. is_head_entity MUST NOT влиять на результат. Источники подчиняются правилам актуальности, периодов и исключения двойного суммирования сводной ОСВ.

Scenario: Реальная ОСВ счёта 58

  • WHEN строится таблица по привязанной ОСВ fixtures/osv-dkb/primanych/2025-Q3/Оборотно-сальдовая ведомость по счету 58 за 9 месяцев 2025 г. ООО Приманыческий.xls
  • THEN учитываются только подходящие строки 58.01 и потомков с контрагентами периметра; 58.03 не включается, строки ACCOUNT не включаются; собственные приоритеты перекрывающихся файлов не применяются

Scenario: Направление не зависит от признака головы

  • WHEN подходящие вложения найдены у двух участников периметра с любыми значениями is_head_entity
  • THEN каждый владелец становится ГО своих пар, включая встречные направления; пустой контрагент, самовложение и внешний контрагент не создают пары

Requirement: Сохранение исчезнувших пар

Таблица SHALL объединять текущие пары с ранее сохранёнными этой версии. has_investments=false обозначает «Нет вложений»: пара отсутствует, её сальдо нулевое или участник вышел из периметра. По решению пользователя денежные поля неактивной строки SHALL быть null. Сохранённый ввод MUST оставаться; неактивная строка не входит в итоги и вклад КФО. Чтение MUST NOT создавать или изменять записи goodwill.

Scenario: Замена источника

  • WHEN после сохранения пары из реальной ОСВ документ заменён и подходящих вложений больше нет
  • THEN строка остаётся с has_investments=false, прежними долей, комментарием и галочкой, но без вклада в итоги; повторное появление пары восстанавливает расчёт по текущим источникам

Requirement: Источник капитала и расчёт

Система SHALL использовать 1310 ББ ДО на конец отчётного периода в рублях; единицы формы SHALL распознаваться словарём единиц arm_statements, нераспознанные единицы дают отсутствующий УК. P=round(УК×доля/100,2), G=ФВ−P. Дубликаты 1310 обрабатываются агрегированием формы. Ноль допустим; отсутствие доли или достоверного УК даёт null P/G. 1350 не участвует: ASSUMPTION(OQ-10).

Scenario: Ноль отличается от отсутствия расчёта

  • WHEN из привязанного реального ББ получен УК U, доля ещё не введена
  • THEN P и G равны null; при доле 0 P равен 0.00 и G равен ФВ; отсутствующая 1310 не подменяется нулём

Scenario: Единицы, исправленные вручную

  • WHEN у формы ББ единицы «тыс.руб.» или «в тысячах рублей»
  • THEN УК переводится в рубли умножением на 1000; единицы «штук» дают УК null и предупреждение CAPITAL_SOURCE_MISSING

Scenario: Проверка отчётной колонки

  • WHEN в привязанном ББ есть несколько сравнительных колонок и единицы «тыс. руб.»
  • THEN УК берётся по дате конца отчётного периода, а не только is_current; сумма переводится в рубли до расчёта

Requirement: Получение таблицы

GET /api/v1/consolidations/versions/{version_id}/goodwill SHALL возвращать version_id, goodwill_enabled, editable, read_only_reason, rows, groups, totals. Строки отсортированы по именам ГО/ДО и ID; содержат поля MD-контракта, has_investments и warnings. Деньги — строки с двумя знаками в рублях или null, доли — строки с двумя знаками. groups — итог «Всего» по каждой ГО в порядке строк, totals — итог по листу.

Scenario: Пустая таблица

  • WHEN нет подходящих вложений и сохранённых пар
  • THEN rows пуст, денежные итоги 0.00; запрос не создаёт goodwill

Requirement: Итоги и предупреждения

Система SHALL суммировать ФВ и УК действующих строк независимо от выбора; P/G — только действующих выбранных рассчитанных строк. goodwill_in_kfo_amount включает только положительные применимые G и равен нулю при выключенном goodwill_enabled. Сумма заполненных долей действующих ГО в одной ДО свыше 100% даёт предупреждение, не ошибку.

Scenario: Несколько ГО одной ДО

  • WHEN у действующих пар одной ДО заполнены доли 70% и 40%
  • THEN строки содержат предупреждение OWNERSHIP_TOTAL_EXCEEDED, сохранение не блокируется; проценты по разным ДО не складываются в общий процент

Scenario: Пример DOC-259025 §11.1

  • WHEN у ГО «Альфа» отмечены Бета (ФВ 180 000, УК 100 000, 80 %) и Гамма (ФВ 50 000, УК 100 000, 80 %), Дельта (ФВ 60 000, УК 60 000) без доли и не отмечена
  • THEN «Всего» и «Итого по листу»: ФВ 290 000, УК 260 000, P 160 000, G 70 000, в КФО 100 000 (при выключенном переключателе — 0)

Requirement: Пакетное сохранение

PUT …/goodwill SHALL принимать набор строк {head_legal_entity_id, subsidiary_legal_entity_id, ownership_share, include_in_kfo, comment} и сохранять его в одной транзакции: все строки проверяются до записи, ошибка любой строки откатывает весь пакет и несёт ключ пары. Доля допускает null только при снятом выборе, иначе 0–100, не больше двух знаков после запятой, запятая или точка; превышение точности не округляется. Для выбранной действующей строки обязателен непустой комментарий до 1000 символов. Ошибки — 404 NOT_FOUND (пары нет в таблице), 422 INVALID_SHARE, COMMENT_REQUIRED, MONEY_OUT_OF_RANGE, DUPLICATE_ROW. Строка, ввод которой не изменился, MUST NOT перезаписываться и писать аудит. Ответ — пересчитанная таблица.

Scenario: Ошибка одной строки пакета

  • WHEN пакет содержит корректную строку и строку отмеченной пары без комментария
  • THEN ответ 422 COMMENT_REQUIRED с head_legal_entity_id и subsidiary_legal_entity_id этой строки; ни одна запись goodwill и ни одно событие GOODWILL_EDIT не созданы

Scenario: Пакет без изменений

  • WHEN повторно отправлена сохранённая строка с той же долей («80,5» после «80.50»), галочкой и комментарием
  • THEN updated_at строки прежний, событий GOODWILL_EDIT не добавилось

Scenario: Снятие выбора

  • WHEN сохраняется действующая строка с include_in_kfo=false и прежними долей и комментарием
  • THEN ввод сохраняется, строка исключается из итогов P/G и вклада КФО; ответ содержит пересчитанную таблицу

Scenario: Повторное сохранение и неактивная строка

  • WHEN повторно сохраняется существующая пара
  • THEN новая запись не создаётся; произвольная неизвестная пара даёт 404, сохранённая неактивная пара не получает дополнительного запрета GOODWILL_PAIR_INACTIVE; отсутствующий ввод не затирает сохранённые данные

Requirement: Переключатель версии

PUT …/goodwill-settings SHALL принимать goodwill_enabled и возвращать таблицу. Выключение MUST NOT очищать строки и ручной ввод; оно отключает вклад в КФО. Изменение значения и сохранение строки SHALL записывать GOODWILL_EDIT с before/after, автором и версией в одной транзакции; повтор прежнего значения переключателя не создаёт изменение.

Scenario: Выключение и включение

  • WHEN пользователь выключает гудвилл и затем включает обратно
  • THEN доли, комментарии и галочки сохранены; вклад вновь вычисляется из актуальных данных, записи КФО не изменяются

Requirement: Общие права и блокировки

Чтение и экспорт SHALL требовать CONSOLIDATION_VIEW и видимость версии. Изменения SHALL требовать CONSOLIDATION_EDIT, редактируемый статус и собственную активную блокировку. Невидимая версия возвращает 404 NOT_FOUND; изменения без доступа — 403, без редактируемости/блокировки — 409 VERSION_NOT_EDITABLE, LOCK_REQUIRED или LOCKED_BY_OTHER.

Scenario: Просмотр завершённой версии

  • WHEN видимая версия VERIFIED или CANCELLED открывается либо изменяется
  • THEN чтение доступно с editable=false, изменение отклоняется без записи goodwill или аудита изменения

Requirement: Экспорт XLSX

GET …/goodwill/export SHALL выгружать XLSX с составом и порядком восьми колонок экранной таблицы. Параметры API остаются прежними: sign выбирает фильтр знака без изменения общих итогов. Деньги выгружаются в рублях; экспорт использует сохранённый ввод, оставляет нерассчитанные значения пустыми и записывает EXPORT. Цветовое оформление стандартное.

Scenario: Выгрузка таблицы

  • WHEN выгружается таблица реальной версии с сохранёнными решениями и неактивной парой
  • THEN XLSX соответствует серверной таблице, содержит «Нет вложений» и не учитывает эту строку в итогах; отдельное событие EXPORT содержит report=goodwill и число строк

Requirement: Пустые значения конечного дебета

По решению пользователя система SHALL суммировать только заполненные closing_debit пары; пустые значения остальных строк MUST NOT блокировать расчёт P/G и сохранение ручного ввода.

Scenario: Заполненная и пустая строки одной пары

  • WHEN у пары есть вложения 269997300.00 и строка с closing_debit=null, доля 100%, УК 100000000.00 и комментарий
  • THEN сохранение разрешено; ФВ=269997300.00, P=100000000.00, G=169997300.00