fix(controller): приложения-оферты ЦПП к заявлению на повестке (wallet::signagree) #108

Merged
ant merged 1 commits from fix/agenda-program-offer-links into dev 2026-06-08 07:03:14 +00:00
Owner

Проблема

При регистрации пайщик выбирает программу участия (Генератор / Благорост). Её оферта должна отображаться как приложение к заявлению на странице повестки совета (рядом с заявлением физлица, политикой ПДн, пользовательским соглашением и положением об ЭП). Связь пропала: оферта подписана и видна в реестре документов, но в приложениях к заявлению её нет.

Причина

С Эпика 2 (commit 21e94ce0edc) программные оферты (program_id > 0) уходят на цепь через wallet::signagree (пишет в wallet::users.programs[]), а не через soviet::sndagreementsoviet::newagreement по такой оферте не создаётся.

Агрегатор document-package-v1.aggregator.ts искал каждое приложение (statement.meta.links[*]) только в soviet::newagreement по doc_hash. Для программной оферты совпадения нет → if (agreement) ложно → оферта молча выпадала из links. До Эпика 2 все соглашения шли через soviet::sndagreement и линковались.

Хэш оферты в statement.meta.links присутствует (иначе registerParticipant бросил бы ошибку валидации ссылок) — проблема в резолве носителя подписи в агрегаторе.

Фикс

  • Резолв каждого linkHash вынесен в общий хелпер buildLinkedAggregate.
  • Носитель подписи ищется в двух источниках: сначала soviet::newagreement, затем фолбэком wallet::signagree (поле document имеет тот же doc_hash/meta/signatures).
  • Унифицированы три дублировавшихся цикла линковки (statement / decision / acts).
  • Добавлен регрессионный unit-тест.

Повестка строит агрегат на лету (agenda.interactor) — фикс действует сразу; БД-проекция реестра (signed_documents) пересобирается тем же агрегатором на следующем soviet-событии пакета.

Проверка

jest document-package-v1.aggregator.spec.ts --runInBand — 2 passed.

🤖 Generated with Claude Code

## Проблема При регистрации пайщик выбирает программу участия (Генератор / Благорост). Её оферта должна отображаться как **приложение к заявлению** на странице повестки совета (рядом с заявлением физлица, политикой ПДн, пользовательским соглашением и положением об ЭП). Связь пропала: оферта подписана и видна в реестре документов, но в приложениях к заявлению её нет. ## Причина С Эпика 2 (commit `21e94ce0edc`) программные оферты (`program_id > 0`) уходят на цепь через **`wallet::signagree`** (пишет в `wallet::users.programs[]`), а не через `soviet::sndagreement` → `soviet::newagreement` по такой оферте не создаётся. Агрегатор `document-package-v1.aggregator.ts` искал каждое приложение (`statement.meta.links[*]`) только в `soviet::newagreement` по `doc_hash`. Для программной оферты совпадения нет → `if (agreement)` ложно → оферта молча выпадала из `links`. До Эпика 2 все соглашения шли через `soviet::sndagreement` и линковались. Хэш оферты в `statement.meta.links` присутствует (иначе `registerParticipant` бросил бы ошибку валидации ссылок) — проблема в резолве носителя подписи в агрегаторе. ## Фикс - Резолв каждого `linkHash` вынесен в общий хелпер `buildLinkedAggregate`. - Носитель подписи ищется в двух источниках: сначала `soviet::newagreement`, затем фолбэком `wallet::signagree` (поле `document` имеет тот же `doc_hash`/`meta`/`signatures`). - Унифицированы три дублировавшихся цикла линковки (statement / decision / acts). - Добавлен регрессионный unit-тест. Повестка строит агрегат на лету (`agenda.interactor`) — фикс действует сразу; БД-проекция реестра (`signed_documents`) пересобирается тем же агрегатором на следующем soviet-событии пакета. ## Проверка jest document-package-v1.aggregator.spec.ts --runInBand — 2 passed. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-08 05:50:02 +00:00
[@ant] fix(controller): приложения-оферты ЦПП к заявлению на повестке (wallet::signagree)
Typecheck / desktop (pull_request) Successful in 14m13s
Typecheck / controller (pull_request) Successful in 13m2s
ca1d1ec1a2
Программные оферты (program_id > 0) с Эпика 2 уходят на цепь через
wallet::signagree (commit 21e94ce0ed), а не soviet::sndagreement —
soviet::newagreement по ним не создаётся. Агрегатор пакета документов
(document-package-v1) искал приложения к заявлению только по
soviet::newagreement, поэтому подписанная оферта молча выпадала из links
и не отображалась как приложение к заявлению на повестке совета (при этом
сам документ виден в реестре).

Резолв каждого linkHash вынесен в общий хелпер buildLinkedAggregate;
носитель подписи ищется сначала в soviet::newagreement, затем фолбэком в
wallet::signagree. Унифицированы три дублировавшихся цикла (statement /
decision / acts). Добавлен регрессионный unit-тест.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude changed title from test-probe to fix(controller): приложения-оферты ЦПП к заявлению на повестке (wallet::signagree) 2026-06-08 05:52:15 +00:00
ant merged commit 9cdee035b9 into dev 2026-06-08 07:03:14 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#108