# Требования:
- **Python 3.11+**
- **Litestar** веб-фреймворк
- **SQLAlchemy**, **Advanced-Alchemy** ORM,
Понимание как работают модели, как запрашивать данные опимально, понимание как работают репозитории advanced-alchemy
- **APScheduler** планировщик задач
- **aiogram** Telegram bot framework
- **that_depends** DI контейнер
нужно создать ряд веток уведомлений и напоминаний через ТГ-бот.
Как по триггеру, так и по расписанию.
Например, уведомления и напоминания о событии.
Сообщения по расписанию с обратной связь в виде кнопок в сообщении.
пример веток
пример возможного ТЗ
# ТЗ
Реализовать напоминания клиентам о предстоящих записях за 24 часа, 2 часа и 15 минут до начала в телеграм боте.
## Описание системы
### Архитектура
```
service/
services/bot.py BotService логика работы бота
scheduler.py setup_scheduler для регистрации задач
infra/database/
models.py SQLAlchemy модели
repositories.py репозитории для работы с БД
```
### Таблицы БД
- Appointment запись клиента на услугу на определенное время
- AppointmentClient связывает множество клиентов с одной записью
- Client клиент
- Specialist специалист, который выполняет услугу
- Business бизнес в котором работает специалист
- Service услуга специалиста
### 1. Периодическая задача
В `service/scheduler.py`:
Создать асинхронную функцию `send_appointment_reminders()`.
Сделать inject BotService c помощью DI.
Вызвать BotService метод достающий нужные данные и отправляющий уведомления.
Пример:
```python
@inject
async def some_task(bot_service: BotService = Provide[IOCContainer.bot_service]) -> None:
pass
```
Зарегистрировать в `scheduler` c интервалом (каждые 5 минут).
Колличество минут вынести как переменную в `settings.scheduler_reminders_interval_in_minutes`.
Пример:
```python
scheduler.add_job(
...
)
```
### 2. Логика отправки
В `service/services/bot.py`
в BotService создать функцию, которая делает запрос данных и отправляет уведомления
`time_period` может быть 24ч (`datetime.timedelta(hours=24)`), 2ч, 15мин
Добавить `settings.scheduler_reminders_time_window_in_minutes=1`
1. **Логика фильтрации db_models.Appointment**:
`db_models.Appointment.status == models.AppointmentStatus.pending`
сформировать временной диапазон в котром будут запрашиваться данные
начало периода: `datetime.now()` + `time_period` `settings.scheduler_reminders_time_window_in_minutes`
конец периода: `datetime.now()` + `time_period` + `settings.scheduler_reminders_time_window_in_minutes`
Сделать запрос, где `db_models.Appointment.start_date` внутри диапазона
2. **Собрать данные**:
service_name из `appointment.service.name`
specialist_name из `appointment.specialist.user.first_name`, `appointment.specialist.user.last_name`
start_date из `appointment.start_date`
business_address из `appointment.location.address`
business_phone из `appointment.specialist.business.phone`
3. **Отправить каждому клиенту**:
Получить `client.user.tg_chat_id` из `appointment.appointment_clients.clients.user`
Вызвать `bot_service.send_message(chat_id, message)`
### 3. Формат сообщения
за 24 часа
```
🔔 НАПОМИНАНИЕ О ЗАПИСИ
Завтра в {time} у вас:
{service_name} у {specialist_name}
📍 {business_address}
📞 Контакты: {business_phone}
```
за 2 часа
```
⏰ СКОРО ВСТРЕЧА!
Через 2 часа в {time}:
{service_name} у {specialist_name}
📍 Адрес: {business_address}
📞 Телефон: {business_phone}
```
за 15 минут
```
👋 ЖДЁМ ВАС!
Надеемся, что вы уже в пути. {specialist_name} готов к вашему визиту.
```
## Примечания
- Сделать запрос в БД и логику как можно более оптимальными
- Продумать названия переменных и функций
- Соблюсти стиль и логику в как в других `service/services`
- Используй `typing.Final` для неизменяемых переменных
- Если у клиента нет `tg_chat_id` пропустить
- Логировать ошибки отправки, не останавливать обработку других клиентов
Разделы:
Опубликован:
22.12.2025 | 11:42 [поднят: 22.12.2025 | 11:42]