# Спецификация V3.1 - Умная рассылка + Еженедельный дайджест > Дата: 6 апреля 2026 г. > Статус: В разработке > Версия: 3.1 --- ## 📢 Умная рассылка с прочтением ### Архитектура **Новые таблицы БД:** - `broadcast` — рассылки - `id` (PK) - `message_id` (Telegram message ID) - `chat_id` - `text` (текст рассылки) - `photo_file_id` (опционально) - `sent_at` (timestamp) - `sent_by` (admin user ID) - `total_sent` (количество получателей) - `has_read_button` (boolean — показывать ли кнопку "Прочитал") - `is_reminder_sent` (было ли напоминание) - `created_at` - `broadcast_read` — кто прочитал - `id` (PK) - `broadcast_id` (FK → broadcast) - `user_id` (FK → users) - `read_at` (timestamp) ### Функционал **В Telegram:** - Рассылка с inline-кнопкой "✅ Прочитал" - При нажатии — обновляется статус в БД - Кнопка меняется на "✅ Прочитано" (неактивная) **В веб-панели:** - Список всех рассылок - Статистика: отправлено / прочитано / не прочитано - Кнопка "Показать кто прочитал" - Кнопка "Показать кто НЕ прочитал" - Кнопка "⚠️ Отправить напоминание непрочитавшим" - Создание новой рассылки с опцией "Добавить кнопку прочтения" ### Команды - `/broadcast` — создать рассылку (админ) - `/broadcast_stats ` — статистика по рассылке --- ## 📰 Еженедельный дайджест ### Архитектура **Новые таблицы БД:** - `digest` — дайджесты - `id` (PK) - `period_start` (начало периода, дата) - `period_end` (конец периода, дата) - `week_number` (номер недели) - `year` (год) - `content` (JSON с данными дайджеста) - `status` — 'draft' | 'pending_approval' | 'approved' | 'rejected' | 'sent' - `message_id` (ID сообщения в Telegram, если отправлен) - `created_at` (автогенерация) - `approved_at` - `approved_by` (admin ID) - `sent_at` - `rejected_by` - `rejection_reason` (причина отклонения) ### Генерация контента **Автоматический сбор данных (воскресенье 09:00):** 1. События за неделю (из таблицы events) 2. Активные опросы (из polls) 3. Новые объявления (из ads) 4. Топ-5 активных жильцов (из users по rating) 5. Запланированные отключения (из schedule на следующую неделю) 6. Новые верификации (из verification_requests) 7. Статистика: всего сообщений, активных пользователей **Формирование текста:** ```python digest_text = f""" 📰 ДАЙДЖЕСТ ДОМА ЗА НЕДЕЛЮ ({period_start} - {period_end}) 🔔 События: {events_list} 📊 Опросы: {polls_list} 📢 Объявления: {ads_count} новых 🏆 Активные жильцы: {top_users} ⏰ На следующей неделе: {schedule_list} 📈 Статистика: • Сообщений в чате: {messages_count} • Активных жильцов: {active_users} • Новых верификаций: {new_verifications} """ ``` ### Процесс утверждения **Автоматический workflow:** 1. **Воскресенье 09:00** — бот генерирует дайджест 2. Сохраняет в БД со статусом `pending_approval` 3. **Отправляет АДМИНУ в личку** превью дайджеста: ``` 📰 Дайджест за неделю готов! [Просмотреть в веб-панели] Статус: ⏳ Ожидает утверждения ``` 4. Админ заходит в веб-панель, видит: ``` ┌─────────────────────────────────────┐ │ 📰 Дайджест за 30.03 - 06.04 │ │ Статус: ⏳ Ожидает утверждения │ ├─────────────────────────────────────┤ │ [Предпросмотр текста] │ │ │ │ [✅ Утвердить и отправить] │ │ [❌ Отклонить] │ │ [✏️ Редактировать текст] │ └─────────────────────────────────────┘ ``` 5. **Если утвердил:** - Статус → `approved` → `sent` - Бот рассылает ВСЕМ верифицированным жильцам - В веб-панели: "✅ Отправлен в 14:32" - В чат (опционально): "📰 Дайджест за неделю опубликован!" 6. **Если отклонил:** - Статус → `rejected` - Можно указать причину - В БД сохраняется (история) ### Хранение и архив **В веб-панели раздел "Архив дайджестов":** ``` 📰 Архив дайджестов Фильтры: [За неделю] [За месяц] [За квартал] [За год] [Все] ┌──────┬──────────────┬──────────┬────────────┐ │ Нед │ Период │ Статус │ Отправлен │ ├──────┼──────────────┼──────────┼────────────┤ │ #14 │ 30.03-06.04 │ ✅ Отпр │ 06.04 14:32│ │ #13 │ 23.03-29.03 │ ✅ Отпр │ 29.03 10:15│ │ #12 │ 16.03-22.03 │ ❌ Откл │ - │ │ ... │ ... │ ... │ ... │ └──────┴──────────────┴──────────┴────────────┘ [Экспорт в PDF] [Экспорт в CSV] ``` **Генерация дайджеста за период:** - Квартальный: сумма недельных дайджестов - Полугодовой: агрегация - Годовой: полная статистика + тренды ### Настройки в веб-панели ``` ⚙️ Настройки дайджеста [✓] Включить автоматическую генерацию День недели: [Воскресенье ▼] Время генерации: [09:00] Время отправки (после утверждения): [10:00] Содержимое: [✓] События [✓] Опросы [✓] Объявления [✓] Топ активных жильцов [✓] Запланированные отключения [✓] Статистика чата [✓] Новые верификации Дополнительно: [✓] Отправлять превью админу [ ] Публиковать автоматически (без утверждения) [✓] Сохранять в архив ``` --- ## План реализации ### Этап 1: База данных - [ ] Модель Broadcast - [ ] Модель BroadcastRead - [ ] Модель Digest - [ ] Миграция БД ### Этап 2: Умная рассылка - [ ] Handler /broadcast - [ ] Inline кнопки "Прочитал" - [ ] Callback обработчики - [ ] Веб-панель: список рассылок - [ ] Веб-панель: статистика - [ ] Веб-панель: создание рассылки - [ ] Напоминания непрочитавшим ### Этап 3: Дайджест - [ ] Сервис генерации контента - [ ] APScheduler задача (воскресенье 09:00) - [ ] Уведомление админу - [ ] Веб-панель: утверждение/отклонение - [ ] Веб-панель: редактирование текста - [ ] Веб-панель: архив дайджестов - [ ] Рассылка после утверждения - [ ] Настройки дайджеста ### Этап 4: Интеграция - [ ] Обновить веб-сервер (новые роуты) - [ ] Обновить меню админа - [ ] Документация --- ## Технические детали ### Используемые технологии - SQLAlchemy модели (async) - aiogram inline keyboards - APScheduler (cron trigger) - FastAPI endpoints - Jinja2 templates ### Совместимость - Не ломает существующий функционал - Миграция БД обратима - Feature flags для включения/выключения