from aiogram import Bot, Router from aiogram.enums import ButtonStyle from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message from aiogram.types.callback_query import CallbackQuery from sqlalchemy.ext.asyncio import AsyncSession from models import Payment, PaymentStatus from models.callback_data import PayInvoiceClb, PaymentStatusClb router = Router(name="payment_status") async def accept(clb: CallbackQuery, bot: Bot, payment: Payment) -> None: payment.status = PaymentStatus.ACCEPTED await bot.send_message(clb.from_user.id, "Оплата пользователя подтверждена.") await bot.send_message(payment.user_id, "Файл подтверждения оплаты принят.") async def reject(clb: CallbackQuery, bot: Bot, payment: Payment) -> None: payment.status = PaymentStatus.REJECTED await bot.send_message(clb.from_user.id, "Оплата пользователя отклонена.") callback_data = PayInvoiceClb(invoice_id=payment.invoice_id).pack() await bot.send_message( payment.user_id, "Файл подтверждения оплаты отклонён. Требуется прислать новый.", reply_markup=InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text="Оплатить", style=ButtonStyle.PRIMARY, callback_data=callback_data, ) ] ] ), ) @router.callback_query(PaymentStatusClb.filter()) async def button( clb: CallbackQuery, bot: Bot, session: AsyncSession, callback_data: PaymentStatusClb, ) -> None: if isinstance(clb.message, Message): await clb.message.delete_reply_markup() payment = await session.get(Payment, callback_data.payment_id) if payment is None: await clb.answer("Платёж был удален.", show_alert=True) return match callback_data.payment_status: case PaymentStatus.ACCEPTED: await accept(clb, bot, payment) case PaymentStatus.REJECTED: await reject(clb, bot, payment) case PaymentStatus.PENDING: raise ValueError("Unable to set payment status to PENDING") await clb.answer()