feat: implement referral payment system and enhance ticket management

This commit is contained in:
2026-04-18 22:34:15 +07:00
parent 3d19d9189b
commit 78a0ef9750
14 changed files with 165 additions and 31 deletions

View File

@@ -6,7 +6,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
from config import settings
from keyboards.admins import promotion_confirmation
from keyboards.client import build_return_menu
from keyboards.client import close_kb
from schemas.di import DependenciesDTO
from schemas.promotions import NewPromotionContext
from states.admins import AdminStorage
@@ -28,7 +28,7 @@ async def push_cmd(msg: Message, state: FSMContext):
ctx = NewPromotionContext(creator_id=msg.from_user.id)
await msg.delete()
await msg.answer(ADMIN_PROMOTION_INIT, reply_markup=build_return_menu("delete", ""))
await msg.answer(ADMIN_PROMOTION_INIT, reply_markup=close_kb)
await state.set_state(AdminStorage.promotion_msg)
await state.set_data({"ctx": ctx})

View File

@@ -6,10 +6,19 @@ from aiogram.utils.deep_linking import create_start_link
from sqlalchemy.ext.asyncio import AsyncSession
from config import settings
from keyboards.client import referals_kb
from keyboards.client import close_kb, referals_kb
from misc.utils import format_share_deep_link
from schemas.common import GeneralMessageContext
from schemas.di import DependenciesDTO
from texts import GENERAL_PROCESSING, REFERALS_MENU
from states.admins import AdminStorage
from texts import (
GENERAL_PROCESSING,
INVALID_ARGUMENT_REFPAY,
REFERALS_MENU,
SPECIFY_REFERAL_PAYMENT_AMOUNT,
SUCCESSFUL_REFPAY,
USER_NO_REFERAL,
)
router = Router()
@@ -45,17 +54,70 @@ async def refpay(
user = await deps.user_service.fetch_user_by_thread(session, msg.message_thread_id)
referal = await deps.user_repository.get_user_by_id(session, user.referal_id)
if not referal:
await status_msg.edit_text("У пользователя нет реферала.")
await status_msg.edit_text(USER_NO_REFERAL)
return
amount = command.args
if not amount.isdigit():
await status_msg.edit_text(
"❌ Укажите в аргументах количество средств, которые необходимо перевести рефералу пользователя."
)
await status_msg.edit_text(INVALID_ARGUMENT_REFPAY)
return
amount = int(amount)
await deps.user_repository.increase_user_balance(session, referal.id, amount)
await status_msg.edit_text(f"<b>💸 Баланс реферала ({referal.id}) пополнен на {amount}₽</b>")
await status_msg.edit_text(SUCCESSFUL_REFPAY.format(referal_id=referal.id, amount=amount))
@router.callback_query(F.message.chat.id == settings.admin_group_id, F.data == "refpay")
async def refpay_cb(
cb: CallbackQuery,
state: FSMContext,
session: AsyncSession,
deps: DependenciesDTO,
):
await state.clear()
user = await deps.user_service.fetch_user_by_thread(session, cb.message.message_thread_id)
referal = await deps.user_repository.get_user_by_id(session, user.referal_id)
if not referal:
await cb.message.answer(USER_NO_REFERAL, reply_markup=close_kb)
return
msg = await cb.message.answer(
SPECIFY_REFERAL_PAYMENT_AMOUNT, reply_markup=close_kb
)
ctx = GeneralMessageContext(msg=msg)
await state.set_state(AdminStorage.refpay_amount)
await state.set_data({"ctx": ctx})
@router.message(
AdminStorage.refpay_amount,
F.chat.id == settings.admin_group_id,
F.from_user.is_bot == False, # noqa: E712
)
async def refpay_execute(
msg: Message, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
):
data = await state.get_data()
await state.clear()
await msg.delete()
ctx: GeneralMessageContext | None = data.get("ctx")
if ctx:
status_msg = ctx.msg
else:
status_msg = await msg.answer(GENERAL_PROCESSING)
amount = msg.text
if not amount.isdigit():
await status_msg.edit_text(INVALID_ARGUMENT_REFPAY, reply_markup=close_kb)
return
user = await deps.user_service.fetch_user_by_thread(session, msg.message_thread_id)
referal = await deps.user_repository.get_user_by_id(session, user.referal_id)
amount = int(amount)
await deps.user_repository.increase_user_balance(session, referal.id, amount)
await status_msg.edit_text(SUCCESSFUL_REFPAY.format(referal_id=referal.id, amount=amount))

View File

@@ -79,3 +79,12 @@ async def close_ticket(
await state.clear()
await deps.user_service.close_ticket(session, msg)
@router.callback_query(F.message.chat.id == settings.admin_group_id, F.data == "close")
async def close_ticket_cb(
cb: CallbackQuery, state: FSMContext, session: AsyncSession, deps: DependenciesDTO
):
await state.clear()
await deps.user_service.close_ticket(session, cb.message)