diff options
| author | Tolmachev Igor <me@igorek.dev> | 2026-03-23 22:43:01 +0300 |
|---|---|---|
| committer | Tolmachev Igor <me@igorek.dev> | 2026-03-23 22:43:01 +0300 |
| commit | f73db3718f0f5f3f74928fac8d5e6769937896d7 (patch) | |
| tree | db39f996b2a096a243716d5cfd4dec5038cb272f /handlers/admin/payment_status.py | |
| parent | 0444ff325490f24e9a8d35f83ba37a0bd95ab6c5 (diff) | |
| download | vpn_manager_bot-f73db3718f0f5f3f74928fac8d5e6769937896d7.tar.gz vpn_manager_bot-f73db3718f0f5f3f74928fac8d5e6769937896d7.zip | |
Add payment_status button
Diffstat (limited to 'handlers/admin/payment_status.py')
| -rw-r--r-- | handlers/admin/payment_status.py | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/handlers/admin/payment_status.py b/handlers/admin/payment_status.py new file mode 100644 index 0000000..23bde15 --- /dev/null +++ b/handlers/admin/payment_status.py | |||
| @@ -0,0 +1,64 @@ | |||
| 1 | from aiogram import Bot, Router | ||
| 2 | from aiogram.enums import ButtonStyle | ||
| 3 | from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message | ||
| 4 | from aiogram.types.callback_query import CallbackQuery | ||
| 5 | from sqlalchemy.ext.asyncio import AsyncSession | ||
| 6 | |||
| 7 | from models import Payment, PaymentStatus | ||
| 8 | from models.callback_data import PayInvoiceClb, PaymentStatusClb | ||
| 9 | |||
| 10 | router = Router(name="payment_status") | ||
| 11 | |||
| 12 | |||
| 13 | async def accept(clb: CallbackQuery, bot: Bot, payment: Payment) -> None: | ||
| 14 | payment.status = PaymentStatus.ACCEPTED | ||
| 15 | await bot.send_message(clb.from_user.id, "Оплата пользователя подтверждена.") | ||
| 16 | await bot.send_message(payment.user_id, "Файл подтверждения оплаты принят.") | ||
| 17 | |||
| 18 | |||
| 19 | async def reject(clb: CallbackQuery, bot: Bot, payment: Payment) -> None: | ||
| 20 | payment.status = PaymentStatus.REJECTED | ||
| 21 | await bot.send_message(clb.from_user.id, "Оплата пользователя отклонена.") | ||
| 22 | |||
| 23 | callback_data = PayInvoiceClb(invoice_id=payment.invoice_id).pack() | ||
| 24 | await bot.send_message( | ||
| 25 | payment.user_id, | ||
| 26 | "Файл подтверждения оплаты отклонён. Требуется прислать новый.", | ||
| 27 | reply_markup=InlineKeyboardMarkup( | ||
| 28 | inline_keyboard=[ | ||
| 29 | [ | ||
| 30 | InlineKeyboardButton( | ||
| 31 | text="Оплатить", | ||
| 32 | style=ButtonStyle.PRIMARY, | ||
| 33 | callback_data=callback_data, | ||
| 34 | ) | ||
| 35 | ] | ||
| 36 | ] | ||
| 37 | ), | ||
| 38 | ) | ||
| 39 | |||
| 40 | |||
| 41 | @router.callback_query(PaymentStatusClb.filter()) | ||
| 42 | async def button( | ||
| 43 | clb: CallbackQuery, | ||
| 44 | bot: Bot, | ||
| 45 | session: AsyncSession, | ||
| 46 | callback_data: PaymentStatusClb, | ||
| 47 | ) -> None: | ||
| 48 | if isinstance(clb.message, Message): | ||
| 49 | await clb.message.delete_reply_markup() | ||
| 50 | |||
| 51 | payment = await session.get(Payment, callback_data.payment_id) | ||
| 52 | if payment is None: | ||
| 53 | await clb.answer("Платёж был удален.", show_alert=True) | ||
| 54 | return | ||
| 55 | |||
| 56 | match callback_data.payment_status: | ||
| 57 | case PaymentStatus.ACCEPTED: | ||
| 58 | await accept(clb, bot, payment) | ||
| 59 | case PaymentStatus.REJECTED: | ||
| 60 | await reject(clb, bot, payment) | ||
| 61 | case PaymentStatus.PENDING: | ||
| 62 | raise ValueError("Unable to set payment status to PENDING") | ||
| 63 | |||
| 64 | await clb.answer() | ||
