diff --git a/app/handlers/admin.py b/app/handlers/admin.py new file mode 100644 index 0000000..ebb5451 --- /dev/null +++ b/app/handlers/admin.py @@ -0,0 +1,73 @@ +from aiogram import Router, F +from aiogram.types import Message, CallbackQuery +from aiogram.filters import Command +from app.db.memory import load_bookings +from app.config import ADMIN_IDS +from app.keyboards.menu import menu +from app.logger import logger + +router = Router() + + +def is_admin(user_id: int) -> bool: + return user_id in ADMIN_IDS + + +@router.message(Command("admin")) +async def admin_panel(message: Message): + if not is_admin(message.from_user.id): + await message.answer( + "⛔️ Доступ запрещен" + ) + return + + logger.info("Admin {uid} opened admin panel", uid=message.from_user.id) + + bookings = load_bookings() + active = [b for b in bookings if b.get("status") == "active"] + + if not active: + await message.answer( + "📋 Активных записей нет" + ) + return + + from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton + + for booking in active: + buttons = [ + [ + InlineKeyboardButton( + text="❌ Отменить", + callback_data=f"admin_cancel_{booking['id']}" + ) + ] + ] + user_name = booking.get("user_name", f"id{booking['user_id']}") + await message.answer( + f"📋 Запись #{booking['id']}\n" + f"👤 Клиент: {user_name}\n" + f"💆 Услуга: {booking['service']}\n" + f"👤 Мастер: {booking['master']}\n" + f"📅 Дата: {booking['date']}\n" + f"🕒 Время: {booking['time']}", + reply_markup=InlineKeyboardMarkup(inline_keyboard=buttons) + ) + + +@router.callback_query(F.data.startswith("admin_cancel_")) +async def admin_cancel_booking(callback: CallbackQuery): + if not is_admin(callback.from_user.id): + await callback.answer("⛔️ Нет доступа") + return + + booking_id = int(callback.data.split("_")[2]) + logger.info("Admin {uid} cancelled booking #{bid}", uid=callback.from_user.id, bid=booking_id) + + from app.db.memory import cancel_booking + cancel_booking(booking_id) + + await callback.message.edit_text( + f"✅ Запись #{booking_id} отменена админом" + ) + await callback.answer("Запись отменена")