diff --git a/src/docbot/handlers/patients/consultation_handler.py b/src/docbot/handlers/patients/consultation_handler.py index 79ce508..2956496 100644 --- a/src/docbot/handlers/patients/consultation_handler.py +++ b/src/docbot/handlers/patients/consultation_handler.py @@ -1,5 +1,5 @@ from telegram import ( - Update, ReplyKeyboardMarkup, ReplyKeyboardRemove, + Update, ReplyKeyboardRemove, InlineKeyboardButton, InlineKeyboardMarkup ) from telegram.ext import ( @@ -32,6 +32,12 @@ PAY_CONSULTATION = 7 STOPPING = 99 + +ACCEPT_PERSONAL_DATA_AGREEMENT_TEXT = ( + "📝 Пожалуйста, подтвердите, что вы согласны с обработкой ваших персональных данных.\n" + "Для этого нажмите кнопку ниже." +) + keyboard = [ [ InlineKeyboardButton( @@ -46,13 +52,8 @@ keyboard = [ ] -ACCEPT_PERSONAL_DATA_AGREEMENT_TEXT = ( - "📝 Пожалуйста, подтвердите, что вы согласны с обработкой ваших персональных данных.\n" - "Для этого нажмите кнопку ниже." -) - - async def accept_personal_data_agreement(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: + keyboard_accept = [ [ InlineKeyboardButton( @@ -71,7 +72,7 @@ async def accept_personal_data_agreement(update: Update, context: ContextTypes.D user_data['telegram_id'] = user_id logger.info(f"User {user_id} initiated consultation process.") - logger.info(f" user exists? {await get_patient_by_telegram_id(user_id)}") + logger.info(f"User exists? {await get_patient_by_telegram_id(user_id)}") if await get_patient_by_telegram_id(user_id): await update.message.reply_text( @@ -91,9 +92,10 @@ async def accept_personal_data_agreement(update: Update, context: ContextTypes.D async def receive_patient_aceptance(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: # Здесь можно добавить логику обработки согласия пациента - + user_data = context.user_data await update.callback_query.answer() + if update.callback_query.data == "accepted": user_data['accepted'] = True user_id = user_data['telegram_id'] @@ -133,28 +135,32 @@ async def choose_consultation_type(update: Update, context: ContextTypes.DEFAULT text="Выберите тип консультации:", reply_markup=InlineKeyboardMarkup(keyboard), ) - + return SELECT_CONSULTATION_TYPE async def enter_patient_phone(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: await update.callback_query.answer() - user_data = context.user_data - user_id = user_data['telegram_id'] + user_id = context.user_data['telegram_id'] patient = await get_patient_by_telegram_id(user_id) has_phone = False if patient: has_phone = await is_user_has_phone(user_id) - + logger.info(f"User {user_id} has phone: {has_phone}") - if update.callback_query.data in ["initial_reception"] and not has_phone: + if update.callback_query.data == 'back': + logger.info(f"User {user_id} requested correction of their phone number") + + if not has_phone: + logger.info(f"Ask user {user_id} enter a phone number.") await update.callback_query.edit_message_text( text="Пожалуйста, введите ваш номер телефона для записи на консультацию:" ) return ENTER_PATIENT_PHONE - elif has_phone: + else: + logger.info(f"Ask user {user_id} enter a doctor's id.") await update.callback_query.edit_message_text( text="Введите серийный номер врача, к которому вы хотите записаться на консультацию:", parse_mode="Markdown" @@ -171,61 +177,104 @@ async def receive_patient_phone(update: Update, context: ContextTypes.DEFAULT_TY # await update_patient_phone(telegram_id=user_id, phone=phone) logger.info((f"receive_patient_phone User {user_id} provided phone: {phone}")) - await update_patient_phone(telegram_id=user_id, phone=phone) context.user_data['phone'] = phone - logger.info((f"receive_patient_phone2 User {user_id} provided phone: {phone}")) + + keyboard = [ + [ + InlineKeyboardButton( + "Назад", + callback_data="back" + ), + ] + ] await update.message.reply_text( - f"Ваш номер телефона: {phone}\n" - "Введите серийный номер врача, к которому вы хотите записаться на консультацию:", - parse_mode="Markdown" + text=f"Ваш номер телефона: {phone}\n" + "Если хотите изменить номер телефона, то нажмите кнопку Назад\n" + "Если всё ок, то введите номер врача.", + parse_mode="Markdown", + reply_markup=InlineKeyboardMarkup(keyboard) ) return ENTER_DOCTOR_NUMBER async def receive_doctor_number(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: - doctor_number = update.message.text.strip() + user_id = context.user_data['telegram_id'] + if not context.user_data.get('doctor_number'): + patient_phone = context.user_data['phone'] + doctor_number = update.message.text.strip() + context.user_data['doctor_number'] = doctor_number - await update.message.reply_text( - f"Вы ввели серийный номер врача: {doctor_number}\n" - "Введите дату и время консультации в формате ДД.ММ.ГГ ЧЧ:ММ, например, 01.01.23 12:00.", - parse_mode="Markdown" - ) + await update_patient_phone(telegram_id=user_id, phone=patient_phone) + logger.info((f"Saved patient's phone number {patient_phone}")) - logger.info(f"phone is {context.user_data['phone']}") + await update.message.reply_text( + text=f"Вы ввели серийный номер врача: {doctor_number}\n" + "Введите дату и время консультации в формате ДД.ММ.ГГ ЧЧ:ММ, например, 01.01.23 12:00.", + parse_mode="Markdown" + ) + else: + logger.info(f"User {user_id} requested correction of their consultation date") + await update.callback_query.answer() + await update.callback_query.edit_message_text( + text="Введите дату и время консультации в формате ДД.ММ.ГГ ЧЧ:ММ, например, 01.01.23 12:00.", + parse_mode="Markdown" + ) return ENTER_CONSULTATION_DATE async def receive_consultation_date(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: consultation_date_time = update.message.text.strip() + context.user_data['consultation_date_time'] = consultation_date_time # Здесь можно добавить логику для сохранения даты консультации в БД # Например, вызов сервиса для создания записи о консультации - patient = await get_patient_by_telegram_id(context.user_data['telegram_id']) + keyboard = [ + [ + InlineKeyboardButton( + "Назад", + callback_data="back" + ), + InlineKeyboardButton( + "Продолжить", + callback_data="proceed" + ), + ] + ] - await create_session( - telegram_id=context.user_data['telegram_id'], - phone=context.user_data['phone'], - consultation_date_time=consultation_date_time, - patient=patient - ) - link = f"https://example.com/consultation/{context.user_data['telegram_id']}" await update.message.reply_text( - f"Чтобы оплатить консультацию перейдите по ссылке {link}.", + text=f"Вы ввели следующую дату консультации: {consultation_date_time}\n" + "Если хотите изменить дату консультации, то нажмите кнопку Назад\n" + "Если всё ок, то нажмите Продолжить.", parse_mode="Markdown", - reply_markup=ReplyKeyboardRemove() + reply_markup=InlineKeyboardMarkup(keyboard) ) return PAY_CONSULTATION async def pay_consultation(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: - await update.message.reply_text( - "💳 Пожалуйста, оплатите консультацию по следующей ссылке: [Оплата](https://example.com/pay)", + user_id = context.user_data['telegram_id'] + phone = context.user_data['phone'] + consultation_date_time = context.user_data['consultation_date_time'] + patient = await get_patient_by_telegram_id(user_id) + + await create_session( + telegram_id=user_id, + phone=phone, + consultation_date_time=consultation_date_time, + patient=patient + ) + + link = f"https://example.com/consultation/{user_id}" + await update.callback_query.answer() + await update.callback_query.message.reply_text( + f"Чтобы оплатить консультацию перейдите по ссылке {link}.", parse_mode="Markdown" ) + return ConversationHandler.END @@ -242,8 +291,15 @@ def get_consultation_handler() -> ConversationHandler: PROCEED_WITH_CONSULTATION: [CallbackQueryHandler(choose_consultation_type)], SELECT_CONSULTATION_TYPE: [CallbackQueryHandler(enter_patient_phone)], ENTER_PATIENT_PHONE: [MessageHandler(filters=None, callback=receive_patient_phone)], - ENTER_DOCTOR_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, receive_doctor_number)], + ENTER_DOCTOR_NUMBER: [ + MessageHandler(filters.TEXT & ~filters.COMMAND, receive_doctor_number), + CallbackQueryHandler(enter_patient_phone, pattern="^" + "back" + "$") + ], ENTER_CONSULTATION_DATE: [MessageHandler(filters=None, callback=receive_consultation_date)], + PAY_CONSULTATION: [ + CallbackQueryHandler(pay_consultation, pattern="^" + "proceed" + "$"), + CallbackQueryHandler(receive_doctor_number, pattern="^" + "back" + "$") + ], STOPPING: [get_start_handler()], }, fallbacks=[get_cancel_handler()], diff --git a/src/docbot/main.py b/src/docbot/main.py index 25aec2f..04dae5b 100644 --- a/src/docbot/main.py +++ b/src/docbot/main.py @@ -19,7 +19,7 @@ def main(): bot_instance = ExtBot(token=settings.BOT_TOKEN) app = ( ApplicationBuilder() - .bot(bot_instance) # явно передаём наш Bot + .bot(bot_instance) .persistence(persistence) .concurrent_updates(concurrent_updates=False) .build() @@ -33,8 +33,9 @@ def main(): app.add_handler(get_verify_handler()) app.add_handler(get_help_handler()) app.add_handler(get_unknown_handler()) - logger.debug("Все хэндлеры зарегистрированы, запускаем polling") + app.add_error_handler(get_start_handler()) + logger.debug("Все хэндлеры зарегистрированы, запускаем polling") app.run_polling()