invoice payment! prerelease

This commit is contained in:
2026-02-15 15:04:50 +07:00
parent 50b1a8f80c
commit 36ffca460f
15 changed files with 240 additions and 41 deletions

View File

@@ -1,13 +1,19 @@
import logging
from aiogram import Router
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__)
@@ -24,6 +30,86 @@ async def activate_invoice(
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>"
) # TODO: Process payment
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>",
)