105 lines
14 KiB
Markdown
105 lines
14 KiB
Markdown
# 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
|