change logic

This commit is contained in:
o.vodianov 2025-08-03 03:58:19 +04:00
parent e9dc210786
commit bcd5aa45e3
2 changed files with 99 additions and 42 deletions

View File

@ -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(
@ -94,6 +95,7 @@ async def receive_patient_aceptance(update: Update, context: ContextTypes.DEFAUL
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']
@ -139,8 +141,7 @@ async def choose_consultation_type(update: Update, context: ContextTypes.DEFAULT
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
@ -149,12 +150,17 @@ async def enter_patient_phone(update: Update, context: ContextTypes.DEFAULT_TYPE
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:
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_patient_phone(telegram_id=user_id, phone=patient_phone)
logger.info((f"Saved patient's phone number {patient_phone}"))
await update.message.reply_text(
f"Вы ввели серийный номер врача: {doctor_number}\n"
text=f"Вы ввели серийный номер врача: {doctor_number}\n"
"Введите дату и время консультации в формате ДД.ММ.ГГ ЧЧ:ММ, например, 01.01.23 12:00.",
parse_mode="Markdown"
)
logger.info(f"phone is {context.user_data['phone']}")
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()],

View File

@ -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()