meet doctor logic

This commit is contained in:
Oleg Oleg 2026-01-10 21:35:28 +04:00
parent ab5479c2b6
commit d808167639
2 changed files with 56 additions and 20 deletions

View File

@ -184,6 +184,7 @@ class NotificationType(enum.Enum):
PAYMENT_RECEIVED = "payment_received" PAYMENT_RECEIVED = "payment_received"
FIRST_REMINDER_SENT = "first_reminder_sent" FIRST_REMINDER_SENT = "first_reminder_sent"
class SessionNotification(Base): class SessionNotification(Base):
__tablename__ = "session_notifications" __tablename__ = "session_notifications"
__table_args__ = ( __table_args__ = (
@ -197,3 +198,15 @@ class SessionNotification(Base):
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now()) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())
sent_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) sent_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True)
last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True) last_error: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
class TariffsSettings(Base):
__tablename__ = "tariffs_settings"
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
name: Mapped[str] = mapped_column(String(100), unique=True, nullable=False)
description: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
price: Mapped[Decimal] = mapped_column(Numeric(12, 2), nullable=False)
consultation_count: Mapped[int] = mapped_column(nullable=False)
duration_days: Mapped[int] = mapped_column(nullable=False)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, server_default=func.now())

View File

@ -6,9 +6,19 @@ from telegram.ext import (
CallbackQueryHandler CallbackQueryHandler
) )
from docbot.handlers.utils.cancel_handler import get_cancel_handler from docbot.handlers.utils.cancel_handler import get_cancel_handler
from core.logging import logger
GET_TERMS_ACKNOWLEDGED = 1
START = 0
TARIFF = 1
LEGAL = 2
WAIT_PAYMENT = 3
TARIFFS = {
"tariff_novice": ("novice", 3990),
"tariff_unlimited": ("unlimited", 5990),
}
async def show_tariffs(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: async def show_tariffs(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:
@ -16,39 +26,51 @@ async def show_tariffs(update: Update, context: ContextTypes.DEFAULT_TYPE) -> in
[ [
InlineKeyboardButton( InlineKeyboardButton(
text="Тариф Новичок\n10 консультаций на месяц\n3990 рублей", text="Тариф Новичок\n10 консультаций на месяц\n3990 рублей",
callback_data="tariff:ten:consultations", callback_data="tariff_novice"
url="https://pay.example.com/novice"
), ),
InlineKeyboardButton( InlineKeyboardButton(
text="Тариф Безлимит\n100 консультаций на месяц\n5990 рублей", text="Тариф Безлимит\n100 консультаций на месяц\n5990 рублей",
callback_data="tariff:hundred:consultations", callback_data="tariff_unlimited"
url="https://pay.example.com/beslimit"
), ),
] ]
] ]
await update.message.reply_text( await update.message.reply_text(
text="Оплатить.\n\n" text="Оплатить.\n\n"
"Юридический текст: для оказания услуг понадобятся ваши персональные данные:\n\n" "Юридический текст: для оказания услуг понадобятся ваши персональные данные:\n"
"фио, специальность и Telegram ID.\n\n" "фио, специальность и Telegram ID.\n\n"
"Нажимая кнопку оплатить, вы соглашаетесь с условиями оферты и обработкой персональных данных\n\n" "Нажимая кнопку оплатить, вы соглашаетесь с условиями оферты и обработкой персональных данных\n\n"
"на условиях Политики обработки перс данных (гиперссылка на оферту и Политику)", "на условиях Политики обработки перс данных (гиперссылка на оферту и Политику)\n\n"
"Бот обработает платеж в течение 10-20 минут и предложит вам регистрацию.\n"
"Чек придет вам на почту, если что-то пойдет не так - пишите @help_milana_in_law",
parse_mode="Markdown", parse_mode="Markdown",
reply_markup=InlineKeyboardMarkup(keyboard_tariff) reply_markup=InlineKeyboardMarkup(keyboard_tariff)
) )
return GET_TERMS_ACKNOWLEDGED return START
async def send_notification(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: async def choose_tariff(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
await update.callback_query.message.reply_text( tariff, price = TARIFFS[query.data]
text="Спасибо вам за доверие!\n\n"
"Бот обработает платеж в течение 10-20 минут и предложит вам регистрацию.\n\n" await query.message.edit_text(
"Чек придет вам на почту, если что-то пойдет не так - пишите @help_milana_in_law" "\n\nНажмите «Оплатить».",
) )
return ConversationHandler.END payment_url = f"https://pay.example.com/payment?tariff={tariff}&price={price}"
pay_keyboard = [
InlineKeyboardButton("Перейти к оплате", url=payment_url)
]
await query.message.reply_text(
"Перейдите к оплате:",
reply_markup=InlineKeyboardMarkup(pay_keyboard),
)
return WAIT_PAYMENT
def meet_doctor_method() -> CommandHandler: def meet_doctor_method() -> CommandHandler:
@ -60,9 +82,10 @@ def get_meet_doctor_handler() -> ConversationHandler:
return ConversationHandler( return ConversationHandler(
entry_points=[meet_doctor_method()], entry_points=[meet_doctor_method()],
states={ states={
GET_TERMS_ACKNOWLEDGED: [ START: [
CallbackQueryHandler(send_notification, pattern="^(tariff)$") CallbackQueryHandler(choose_tariff, pattern="^tariff_")
], ],
WAIT_PAYMENT: [],
}, },
fallbacks=[get_cancel_handler()], fallbacks=[get_cancel_handler()],
name="meet_doctor_handler", name="meet_doctor_handler",