fix(gateway): не плодить повторный регистрационный платёж после приёма #98

Merged
ant merged 4 commits from feat/registration-payment-dedup into feat/registration-refund 2026-06-06 06:49:15 +00:00
Owner

Stacked на #97 (feat/registration-refund). После последовательного мерджа (#91→#95→#97→dev) перетаргетится на dev.

Баг

При перезаходе/перезагрузке страницы оплаты в момент приёма вступительного взноса заводился ВТОРОЙ регистрационный платёж. Дедуп findActivePendingPayment ловит только status=PENDING; когда первый платёж уже PAID/COMPLETED (принят, аккаунт регистрируется), дедуп промахивался → createInitialPayment создавал платёж-дубль. Его нельзя ни подтвердить (processIncomingPayment → registerBlockchainAccount → «аккаунт уже зарегистрирован»), ни осмысленно отклонить — мусорный сирота в реестре.

Фикс

Регистрационный платёж одноразовый: берём последний рег-платёж пайщика; если он в живом статусе (PENDING/PROCESSING/PAID/COMPLETED) — возвращаем его, новый не создаём. Новый ордер только если прошлого нет либо он FAILED/EXPIRED/CANCELLED (легитимная повторная попытка / после resetRegistration). Авторитетная защита на бэке, не зависит от гонок на фронте (#95 server-truth + поллинг закрывают триггер, но источник дубля — бэк).

🤖 Generated with Claude Code

Stacked на #97 (feat/registration-refund). После последовательного мерджа (#91→#95→#97→dev) перетаргетится на dev. ## Баг При перезаходе/перезагрузке страницы оплаты в момент приёма вступительного взноса заводился ВТОРОЙ регистрационный платёж. Дедуп findActivePendingPayment ловит только status=PENDING; когда первый платёж уже PAID/COMPLETED (принят, аккаунт регистрируется), дедуп промахивался → createInitialPayment создавал платёж-дубль. Его нельзя ни подтвердить (processIncomingPayment → registerBlockchainAccount → «аккаунт уже зарегистрирован»), ни осмысленно отклонить — мусорный сирота в реестре. ## Фикс Регистрационный платёж одноразовый: берём последний рег-платёж пайщика; если он в живом статусе (PENDING/PROCESSING/PAID/COMPLETED) — возвращаем его, новый не создаём. Новый ордер только если прошлого нет либо он FAILED/EXPIRED/CANCELLED (легитимная повторная попытка / после resetRegistration). Авторитетная защита на бэке, не зависит от гонок на фронте (#95 server-truth + поллинг закрывают триггер, но источник дубля — бэк). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude changed target branch from feat/registration-refund to dev 2026-06-05 19:08:13 +00:00
claude changed target branch from dev to feat/registration-refund 2026-06-05 19:16:57 +00:00
claude added 1 commit 2026-06-05 19:16:57 +00:00
Баг: при перезаходе/перезагрузке страницы оплаты в момент приёма взноса
заводился второй регистрационный платёж. Дедуп findActivePendingPayment ловит
только status=PENDING — а когда первый платёж уже PAID/COMPLETED (принят,
аккаунт регистрируется), дедуп промахивался и createInitialPayment создавал
платёж-дубль. Его нельзя ни подтвердить (processIncomingPayment →
registerBlockchainAccount → «аккаунт уже зарегистрирован»), ни осмысленно
отклонить — мусорный сирота в реестре.

Фикс: регистрационный платёж одноразовый. Берём последний рег-платёж пайщика
и, если он в живом статусе (PENDING/PROCESSING/PAID/COMPLETED), возвращаем его
вместо создания нового. Новый ордер заводим только если прошлого нет либо он
FAILED/EXPIRED/CANCELLED (легитимная повторная попытка, в т.ч. после
resetRegistration). Авторитетная защита на бэке, не зависит от гонок на фронте.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claude added 1 commit 2026-06-05 19:42:23 +00:00
claude added 1 commit 2026-06-06 05:39:10 +00:00
hover ставил background: var(--p-surface) (#fff на light) — карта на
--p-canvas (#f4f4f5) осветлялась до белого, выглядело как засвет выбора.
На dark было ок (canvas #0a0a0a → surface #141416 — чуть светлее).
Замена на --p-canvas-2: на light темнее канвы, на dark светлее — hover
идёт в одну сторону с темой в обеих.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude added 1 commit 2026-06-06 05:50:51 +00:00
1. WaitingRegistration: крутящийся спиннер заменён статичной иконкой
   hourglass_top с подписью «Ожидаем решение совета». Анимация загрузки
   на процессе до 30 дней сбивала с толку — казалось, страница не дозагрузилась.
2. fixData (возврат к редактированию после отклонённого платежа) теперь зовёт
   новый store.resetConsents(): сбрасывает agreements (устав/ПД/…) + подписи +
   документы. Раньше галочка «прочитал устав» оставалась проставленной на
   повторном проходе ReadStatement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ant merged commit 61570457db into feat/registration-refund 2026-06-06 06:49:15 +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#98