117 lines
3.8 KiB
Python
117 lines
3.8 KiB
Python
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
|
|
from misc.kb.common import 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"<b>💎 Счёт на {invoice.amount}₽</b>\n\n"
|
|
"<i>🔸 Проведите оплату по реквизитам ниже:</i>\n"
|
|
f"🪪 Номер карты: <code>{card_info.number}</code>\n"
|
|
f"👤 Держатель карты: <b>{card_info.holder}</b>",
|
|
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(
|
|
"<b>💸 Вы отметили платёж как оплаченый.</b> Если вы сделали это ошибочно, проведите платёж в ближайшее время.",
|
|
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="<b><i>🟡 Счёт помечен как оплаченый, жду подтверждения...</i></b>",
|
|
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"<b>✅ Платёж на {invoice.amount}₽ успешно оплачен.</b>",
|
|
)
|