import logging from aiogram import Router, F from aiogram.filters import CommandObject, CommandStart from aiogram.fsm.context import FSMContext from aiogram.types import ( CallbackQuery, Message, ) from sqlalchemy.ext.asyncio import AsyncSession from db.models.invoices import InvoiceStatus from misc.kb.admins import verify_payment from misc.kb.client import confirm_payment, return_menu from repositories.invoices import InvoiceRepository from config import card_info router = Router() logger = logging.getLogger(__name__) @router.message(CommandStart(deep_link=True, deep_link_encoded=True)) async def activate_invoice( msg: Message, command: CommandObject, session: AsyncSession, invoice_repo: InvoiceRepository, ): payload = command.args invoice_id = int(payload.split(":")[1]) invoice = await invoice_repo.get_invoice_by_id(session, invoice_id) if not invoice: await msg.answer( "⏳ Счёт истёк. Повторите попытку позже.", reply_markup=return_menu ) return if invoice.status != InvoiceStatus.PENDING: await msg.answer("⏳ Этот счёт недоступен.", reply_markup=return_menu) return if not (card_info.number and card_info.holder): await msg.answer( "🍃 Оплата недоступна, повторите попытку позже.", reply_markup=return_menu ) return await msg.answer( f"💎 Счёт на {invoice.amount}₽\n\n" "🔸 Проведите оплату по реквизитам ниже:\n" f"🪪 Номер карты: {card_info.number}\n" f"👤 Держатель карты: {card_info.holder}", reply_markup=confirm_payment(invoice_id), ) @router.callback_query(F.data.startswith("refresh_payment:")) async def refresh_payment( cb: CallbackQuery, state: FSMContext, session: AsyncSession, invoice_repo: InvoiceRepository, ): await state.clear() invoice_id = int(cb.data.split(":")[1]) invoice = await invoice_repo.get_invoice_by_id(session, invoice_id) if not invoice: await cb.message.edit_text("🍃 Оплата недоступна.") return await cb.message.edit_reply_markup() await cb.message.reply( "💸 Вы отметили платёж как оплаченый. Если вы сделали это ошибочно, проведите платёж в ближайшее время.", reply_markup=return_menu, ) await invoice_repo.update_invoice_status( session, invoice_id=invoice.id, status=InvoiceStatus.PAID ) await cb.bot.edit_message_text( inline_message_id=invoice.inline_message_id, text="🟡 Счёт помечен как оплаченый, жду подтверждения...", reply_markup=verify_payment(invoice.id), ) @router.callback_query(F.data.startswith("verify_payment:")) async def verify_payment_cb( cb: CallbackQuery, state: FSMContext, session: AsyncSession, invoice_repo: InvoiceRepository, ): await state.clear() invoice_id = int(cb.data.split(":")[1]) invoice = await invoice_repo.get_invoice_by_id(session, invoice_id) if cb.from_user.id != invoice.creator_id: await cb.answer("❌ Подтвердить может только создатель счёта") return await invoice_repo.update_invoice_status( session, invoice_id=invoice_id, status=InvoiceStatus.RECEIVED ) await cb.bot.edit_message_text( inline_message_id=invoice.inline_message_id, text=f"✅ Платёж на {invoice.amount}₽ успешно оплачен.", )