Files
demo_spa_bot/app/handlers/booking.py
T
grigorij 9282c1bbfb Добавлен полноценный сценарий записи
- выбор услуги через inline-кнопки
- выбор даты через календарь
- выбор времени через кнопки
- подтверждение записи
- отмена записи
- редактирование записи
- сохранение времени записи
- исправлена работа FSM
- исправлены callback-обработчики
- улучшен интерфейс бота
2026-06-13 19:51:11 +04:00

206 lines
4.6 KiB
Python

import re
from aiogram import Router, F
from aiogram.fsm.context import FSMContext
from aiogram.filters import StateFilter
from aiogram.types import Message, CallbackQuery
from app.keyboards.services import get_services_keyboard
from app.states.booking import BookingState
from app.services.booking_service import create_booking
from app.keyboards.menu import menu, cancel_menu
from app.keyboards.calendar import get_dates_keyboard
from app.keyboards.time_slots import get_time_keyboard
from app.keyboards.confirm_booking import get_confirm_booking_keyboard
router = Router()
# отмена записи на любом шаге
@router.message(F.text.lower() == "отмена")
async def cancel(message: Message, state: FSMContext):
await state.clear()
await message.answer(
"❌ Запись отменена",
reply_markup=menu
)
# старт записи
@router.message(F.text == "📅 Записаться")
async def start_booking(message: Message, state: FSMContext):
await state.clear()
await state.set_state(BookingState.service)
await message.answer(
"Выберите услугу:",
reply_markup=get_services_keyboard()
)
@router.callback_query(
StateFilter(BookingState.service),
F.data.startswith("service_")
)
async def choose_service(
callback: CallbackQuery,
state: FSMContext
):
services = {
"service_massage": "Массаж",
"service_spa": "SPA",
"service_cosmetology": "Косметология"
}
service_name = services[callback.data]
await state.update_data(
service=service_name
)
await state.set_state(
BookingState.date
)
await callback.message.edit_text(
"📅 Выберите дату:",
reply_markup=get_dates_keyboard()
)
await callback.answer()
# выбор даты
@router.callback_query(
StateFilter(BookingState.date),
F.data.startswith("date_")
)
async def choose_date(
callback: CallbackQuery,
state: FSMContext
):
selected_date = callback.data.replace(
"date_",
""
)
await state.update_data(
date=selected_date
)
await state.set_state(
BookingState.time
)
await callback.message.edit_text(
"🕒 Выберите время:",
reply_markup=get_time_keyboard()
)
await callback.answer()
@router.callback_query(
StateFilter(BookingState.time),
F.data.startswith("time_")
)
async def choose_time(
callback: CallbackQuery,
state: FSMContext
):
selected_time = callback.data.replace(
"time_",
""
)
await state.update_data(
time=selected_time
)
data = await state.get_data()
await state.set_state(
BookingState.confirm
)
await callback.message.edit_text(
f"📋 Проверьте запись:\n\n"
f"💆 Услуга: {data['service']}\n"
f"📅 Дата: {data['date']}\n"
f"🕒 Время: {selected_time}",
reply_markup=get_confirm_booking_keyboard()
)
await callback.answer()
# подтверждение
@router.callback_query(
StateFilter(BookingState.confirm),
F.data == "confirm_booking"
)
async def confirm_booking_callback(
callback: CallbackQuery,
state: FSMContext
):
data = await state.get_data()
create_booking(
user_id=callback.from_user.id,
service=data["service"],
date=data["date"],
time=data["time"]
)
await state.clear()
await callback.message.edit_text(
"✅ Запись успешно создана"
)
await callback.answer()
@router.callback_query(
StateFilter(BookingState.confirm),
F.data == "cancel_booking"
)
async def cancel_booking_callback(
callback: CallbackQuery,
state: FSMContext
):
await state.clear()
await callback.message.edit_text(
"❌ Запись отменена"
)
await callback.answer()
@router.callback_query(
StateFilter(BookingState.confirm),
F.data == "edit_booking"
)
async def edit_booking_callback(
callback: CallbackQuery,
state: FSMContext
):
old_data = await state.get_data()
await state.clear()
await state.update_data(
service=old_data.get("service")
)
await state.set_state(
BookingState.service
)
from app.keyboards.services import get_services_keyboard
await callback.message.edit_text(
"Выберите услугу:",
reply_markup=get_services_keyboard()
)