-расширил FSM новым состоянием master; -добавил новую клавиатуру masters.py; -изменил сценарий записи; -доработал окно подтверждения записи; -расширил структуру хранения бронирований.
241 lines
5.4 KiB
Python
241 lines
5.4 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.keyboards.masters import get_masters_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.master
|
|
)
|
|
await callback.message.edit_text(
|
|
"👤 Выберите специалиста:",
|
|
reply_markup=get_masters_keyboard()
|
|
)
|
|
|
|
await callback.answer()
|
|
|
|
#выбор мастера
|
|
@router.callback_query(
|
|
StateFilter(BookingState.master),
|
|
F.data.startswith("master_")
|
|
)
|
|
async def choose_master(
|
|
callback: CallbackQuery,
|
|
state: FSMContext
|
|
):
|
|
|
|
masters = {
|
|
"master_anna": "Анна",
|
|
"master_maria": "Мария",
|
|
"master_alex": "Алексей"
|
|
}
|
|
|
|
master_name = masters[callback.data]
|
|
|
|
await state.update_data(
|
|
master=master_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"👤 Мастер:{data['master']}\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"],
|
|
master=data["master"],
|
|
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()
|
|
)
|