Тикеты заявок, «пробное занятие», доработка ветки вебинара

- Тикеты: add_lead возвращает id заявки; при передаче менеджеру клиент получает
  «🎫 Номер вашей заявки: №N», тот же номер — в карточке оператору и в письме.
  Один тикет на заход (сбрасывается при новом старте воронки/интенсива).
- Кнопка «Записаться на пробное» → «Записаться на пробное занятие» (лейблы + распознавание).
- Ветка вебинара: вход по callback-кнопке и по тексту «записаться на вебинар»,
  текст выровнен по ТЗ, после регистрации состояние FREE_CHAT — основное меню
  остаётся доступным (не блокирует продающую ветку). Дата/время — в config.

Тесты: test_baza_question_ticket, test_webinar_registration. pytest 36 passed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Kenik
2026-07-26 10:04:19 +03:00
parent 7889a19744
commit 7caecb1c72
4 changed files with 111 additions and 10 deletions
+22
View File
@@ -74,6 +74,28 @@ def test_baza_records_lead_once(app):
assert any("Групповой" in name for name, _ in s["by_service"])
def test_baza_question_ticket(app):
"""§9: клиенту и в карточку оператору уходит номер заявки (тикет)."""
u = 70040
app._sent.clear()
app.handle_message(u, "Задать вопрос 💬")
app.handle_message(u, "Есть ли рассрочка?")
ticket = bot.db.get_profile(u).get("ticket")
assert ticket # тикет присвоен
assert any(f"{ticket}" in s["msg"] for s in app._sent) # клиент видит номер
def test_webinar_registration(app):
"""Ветка вебинара: регистрация, метка, остаётся в боте (меню доступно)."""
u = 70041
app.handle_message(u, "записаться на вебинар")
assert "webinar_registered" in bot.db.get_profile(u).get("metki", [])
assert _state(u) == "FREE_CHAT"
# основное меню доступно — обычная продающая ветка запускается
app.handle_message(u, "Подобрать тренировку 🎯")
assert _state(u) == "BAZA_FORWHO"
def test_baza_smart_skip_known_fields(app):
"""§15: уже сохранённые ответы не переспрашиваются."""
u = 70020