mirror of
https://github.com/olegvodyanov/docbot.git
synced 2026-02-02 02:45:46 +03:00
meet doctor logic
This commit is contained in:
parent
ab5479c2b6
commit
d808167639
@ -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__ = (
|
||||||
@ -196,4 +197,16 @@ class SessionNotification(Base):
|
|||||||
type: Mapped[NotificationType] = mapped_column(nullable=False)
|
type: Mapped[NotificationType] = mapped_column(nullable=False)
|
||||||
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())
|
||||||
@ -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Нажмите «Оплатить».",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
payment_url = f"https://pay.example.com/payment?tariff={tariff}&price={price}"
|
||||||
|
pay_keyboard = [
|
||||||
|
InlineKeyboardButton("Перейти к оплате", url=payment_url)
|
||||||
|
]
|
||||||
|
|
||||||
return ConversationHandler.END
|
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",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user