aboutsummaryrefslogtreecommitdiff
path: root/handlers/admin/payment_status.py
blob: 8784ac461257bcb1eaf740a42320f0165d5e150b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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:
    assert clb.message is not None

    payment.status = PaymentStatus.ACCEPTED
    await clb.message.reply("Оплата пользователя подтверждена.")
    await bot.send_message(payment.user_id, "Файл подтверждения оплаты принят.")


async def reject(clb: CallbackQuery, bot: Bot, payment: Payment) -> None:
    assert clb.message is not None

    payment.status = PaymentStatus.REJECTED
    await clb.message.reply("Оплата пользователя отклонена.")

    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()