fix(registration): pending-счёт не считать «оплачено» — вести на оплату, а не на ожидание
Typecheck / desktop (pull_request) Successful in 13m50s
Typecheck / controller (pull_request) Has been cancelled

Счёт регистрационного взноса создаётся со статусом pending сразу при заходе на
шаг оплаты («счёт выставлен», деньги ещё не получены). При возврате на страницу
(перезагрузка/повторный вход) роутинг считал сам факт наличия платежа за «этап
оплаты пройден» и вёл на экран ожидания, где дефолтная ветка показывала «Ваш
платеж принят» — хотя оплаты не было и статус не менялся.

- SignUp: на экран ожидания/отказа ведём только при PAID/COMPLETED либо
  терминальном статусе (отказ/отмена/возврат); pending → шаг оплаты (QR + поллинг).
- WaitingRegistration: для pending — отдельная ветка «Ожидаем поступление оплаты»
  + кнопка «Перейти к оплате»; «платёж принят» остаётся только для PAID/COMPLETED.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
coopops
2026-06-16 05:29:50 +00:00
parent 7ab0c31878
commit 2d71706840
2 changed files with 30 additions and 9 deletions
@@ -82,19 +82,25 @@ onMounted(() => {
store.step = steps.WaitingRegistration;
return;
}
// Есть незавершённый вступительный платёж (ожидание подтверждения денег или
// отклонение председателем) — восстанавливаем экран ожидания/отказа даже
// после перезагрузки и в любой вкладке. Процесс может тянуться днями.
// Незавершённый вступительный платёж. PENDING означает «счёт выставлен», а НЕ
// «деньги получены»: строку счёта мы создаём сразу при заходе на шаг оплаты.
// Поэтому на экран ожидания/отказа ведём ТОЛЬКО когда деньги уже поступили
// (PAID/COMPLETED) либо платёж в терминальном статусе (отказ/отмена/возврат).
// Приоритет над статусом: при отказе платежа показываем причину, а не гоним
// «оплатить заново».
if (session.registrationPayment) {
const regPaymentStatus = session.registrationPayment?.status;
if (regPaymentStatus && regPaymentStatus !== Zeus.PaymentStatus.PENDING) {
store.step = steps.WaitingRegistration;
return;
}
// Сервер — источник истины о шаге: заявление уже подписано (Joined), но
// оплаты ещё нет → возвращаем на шаг оплаты. Так процесс переживает
// перезагрузку и открытие в другой вкладке, не завися от localStorage.
if (userStatus === Zeus.UserStatus.Joined) {
// Сервер — источник истины о шаге: заявление подписано (Joined) либо счёт
// выставлен, но не оплачен (PENDING) → возвращаем на шаг оплаты (там QR +
// поллинг приёма денег). Так процесс переживает перезагрузку и открытие в
// другой вкладке, не завися от localStorage.
if (
regPaymentStatus === Zeus.PaymentStatus.PENDING ||
userStatus === Zeus.UserStatus.Joined
) {
store.step = steps.PayInitial;
return;
}
@@ -38,7 +38,15 @@ div
//- Техническая ошибка обработки — направляем в поддержку.
template(v-else-if='isFailed')
p Произошла ошибка при регистрации. Пожалуйста, обратитесь в поддержку для устранения проблемы.
//- Штатное ожидание: деньги приняты, ждём решение совета.
//- Счёт выставлен, но деньги ещё НЕ поступили (PENDING) — это НЕ «принят».
//- Возвращаем пайщика к оплате, чтобы он завершил вступительный взнос.
template(v-else-if='isAwaitingPayment')
BaseBanner.q-mb-md(variant='info')
.text-bold Ожидаем поступление оплаты.
p.q-mt-xs.q-mb-none Счёт на вступительный взнос выставлен, но оплата ещё не поступила. Завершите оплату, чтобы заявление ушло на рассмотрение совета.
.row.q-gutter-sm
BaseButton(variant='primary', @click='retryPayment') Перейти к оплате
//- Штатное ожидание: деньги поступили (PAID/COMPLETED), ждём решение совета.
template(v-else)
p Ваш платеж принят. Ожидаем, когда совет рассмотрит Ваше заявление и примет решение о приёме Вас в пайщики. Рассмотрение может занять до 30 дней, но обычно решение принимается в течение одного-двух дней. Вы получите уведомление, когда решение будет принято.
span Эту страницу можно закрыть, а при необходимости, войти с другого устройства с помощью ключа доступа, который был сохранён ранее.
@@ -83,6 +91,13 @@ const isDeclined = computed(() => {
);
});
// Счёт выставлен, но деньги ещё не поступили (PENDING). Это НЕ «платёж принят»:
// строку счёта создаём сразу при заходе на шаг оплаты, она не подтверждает
// поступление средств. Показываем «ожидаем оплату» + кнопку возврата к оплате.
const isAwaitingPayment = computed(
() => registrationPayment.value?.status === Zeus.PaymentStatus.PENDING
);
const declineMessage = computed(() => registrationPayment.value?.message || '');
// Отказ совета (declinereg) — два шага возврата, бэкенд отдаёт их по