fix(gateway): исходящий платёж скрыт от кассира до решения совета #21

Merged
ant merged 1 commits from fix/wallet-withdraw-gateway-timing into dev 2026-05-22 07:03:53 +00:00
Owner

Summary

Платёж по заявке на возврат паевого взноса сейчас создаётся в gateway PG со status=PENDING сразу при подаче заявки пайщиком — кассир видит заявку как готовую к выплате до того как совет её утвердил.

Фикс:

  • Новый статус PaymentStatusEnum.AWAITING_AUTHORIZATION («Ожидает решения совета»).
  • В gateway.interactor.ts::createWithdraw initial status переключён с PENDING на AWAITING_AUTHORIZATION.
  • Новый WithdrawAuthorizationListener слушает on-chain действия и переключает статус:
    • action::wallet::authwthd → AWAITING_AUTHORIZATION → PENDING (совет авторизовал, кассир может выплачивать).
    • action::wallet::declinewthd → AWAITING_AUTHORIZATION → CANCELLED.

Why

Жалоба пользователя: «исходящий платёж летит в gateway вместе с предложением повестки, раньше времени». Совет ещё не голосовал, а кассир уже видит «готовую к выплате» заявку.

Out of scope

  • UI (desktop) должен в отдельном PR убрать/фильтровать AWAITING_AUTHORIZATION из таблицы платежей кассира. Текущий UI может уже не показывать неизвестный статус — это нужно проверить вручную после деплоя.
  • Перенос создания payment row в чистый syncer gateway::outcomes (когда parser2 ловит on-chain createoutpay delta) — отдельной задачей. Сейчас row создаётся сразу при createWithdraw, но скрыт от кассира статусом — это purely-statusный фикс.

Test plan

  • CI: tsc controller — зелёный
  • После deploy: подать заявку на возврат → проверить в PG payment.status=AWAITING_AUTHORIZATION; UI кассира её не показывает / показывает как «ожидает совета»
  • Совет авторизует → проверить переход в PENDING (кассир видит)
  • Совет отклоняет → проверить переход в CANCELLED
## Summary Платёж по заявке на возврат паевого взноса сейчас создаётся в gateway PG со status=PENDING **сразу** при подаче заявки пайщиком — кассир видит заявку как готовую к выплате **до** того как совет её утвердил. Фикс: - Новый статус `PaymentStatusEnum.AWAITING_AUTHORIZATION` («Ожидает решения совета»). - В `gateway.interactor.ts::createWithdraw` initial status переключён с PENDING на AWAITING_AUTHORIZATION. - Новый `WithdrawAuthorizationListener` слушает on-chain действия и переключает статус: - `action::wallet::authwthd` → AWAITING_AUTHORIZATION → PENDING (совет авторизовал, кассир может выплачивать). - `action::wallet::declinewthd` → AWAITING_AUTHORIZATION → CANCELLED. ## Why Жалоба пользователя: «исходящий платёж летит в gateway вместе с предложением повестки, раньше времени». Совет ещё не голосовал, а кассир уже видит «готовую к выплате» заявку. ## Out of scope - **UI (desktop)** должен в отдельном PR убрать/фильтровать AWAITING_AUTHORIZATION из таблицы платежей кассира. Текущий UI может уже не показывать неизвестный статус — это нужно проверить вручную после деплоя. - Перенос **создания payment row** в чистый syncer `gateway::outcomes` (когда parser2 ловит on-chain createoutpay delta) — отдельной задачей. Сейчас row создаётся сразу при createWithdraw, но скрыт от кассира статусом — это purely-statusный фикс. ## Test plan - CI: tsc controller — зелёный - После deploy: подать заявку на возврат → проверить в PG payment.status=AWAITING_AUTHORIZATION; UI кассира её не показывает / показывает как «ожидает совета» - Совет авторизует → проверить переход в PENDING (кассир видит) - Совет отклоняет → проверить переход в CANCELLED
claude added 1 commit 2026-05-21 10:35:27 +00:00
Pre-mature payment row: при wallet.interactor.ts::createWithdraw платёж
сразу появлялся в gateway PG со status=PENDING — кассир видел заявку
как готовую к выплате ДО того как совет её утвердил.

Минимальный фикс без переписывания create/sync-цепочки:

- PaymentStatusEnum += AWAITING_AUTHORIZATION (с лейблом «Ожидает
  решения совета»). Initial status в gateway.interactor.createWithdraw
  переключён с PENDING на AWAITING_AUTHORIZATION.
- Новый WithdrawAuthorizationListener в gateway.module:
  - on-chain `wallet::authwthd` (совет авторизовал)
    → AWAITING_AUTHORIZATION → PENDING (кассир увидит и сможет подтвердить).
  - on-chain `wallet::declinewthd` (совет/Gateway отказал)
    → AWAITING_AUTHORIZATION → CANCELLED.

UI кассира (desktop) должен в отдельном PR фильтровать AWAITING_AUTHORIZATION
из списка платежей (текущие компоненты, скорее всего, и так не показывают
неизвестный статус). PAYMENT_STATUS_LABELS подхватится автоматически.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
ant approved these changes 2026-05-22 07:03:41 +00:00
ant merged commit 1f10a3c092 into dev 2026-05-22 07:03:53 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#21