Версия 1.5.0 — 2026-06-01
Интеграция с мессенджером MAX: автоматические уведомления о состоянии журналов в общий чат + модуль «Объявления» для запланированных рассылок.
Добавлено
Клиент MAX-бот API
App\Services\MaxService— лёгкая обёртка надbotapi.max.ru. Методы:sendMessage(),notify()(безопасная),paginate()для длинных сообщений (лимит 3800 символов с пометками «(часть N/M)»).- Аутентификация — заголовок
Authorization: <token>(неBearer). - Поддержка debug-режима (
MAX_DEBUG_LOG=true— пишет в лог вместо реальной отправки). - Конфиг в
config/services.php→services.max.
Защита от повторов
App\Services\MaxNotifier::sendOnce($eventType, $dedupKey, $text)— обёртка надMaxServiceс UNIQUE-индексом поdedup_keyв таблицеmax_notification_log.- Если ключ уже был —
INSERTпадает с конфликтом и HTTP-вызов в MAX не идёт. Это спасает от cron'а, который бегает раз в N минут. - Формат ключа:
<тип>:<идентификаторы>:<дата>:<получатель>[:bucket].
Автоматические сводки (cron в routes/console.php)
| Команда | Расписание | Что делает |
|---|---|---|
max:slot-summary morning |
*/15 11-15 * * * |
Сводка незакрытых утренних слотов (t°/влажность, холодильники, утренняя уборка) с разбивкой по подразделениям |
max:slot-summary evening |
*/15 18-22 * * * |
То же для вечера |
max:overdue-cleanings |
0 10 * * * |
Просроченные генеральные уборки (план есть, факта нет) |
max:uv-lamps |
0 * * * * |
УФ-лампы с наработкой >7899 ч |
max:dispatch-announcements |
* * * * * |
Шлёт запланированные объявления, у которых scheduled_at <= now() |
Дедупликация:
- Сводки утра/вечера — по дате (
morning_summary:YYYY-MM-DD), переотправка в тот же день блокируется. - Просрочки — по дате запуска.
- УФ-лампы — по
(кабинет, целая часть часов). Пока наработка не растёт между сеансами — повторно не пингуем. - Объявления — через состояние (
status = sent→ запрос больше не выбирает).
Все команды поддерживают флаг --force для ручного запуска с обходом dedup (нужен для тестов).
Observer на замену УФ-лампы
App\Observers\UltravioletBactericidalEntryObserver — отправляет уведомление в общий чат при создании или сохранении записи с lamp_replaced=true. Dedup-ключ привязан к entry_id, поэтому правки одной записи не дублируют пинг.
Модуль «Объявления в MAX»
/resource/max-announcement-resource/index-page — управление запланированными сообщениями в общий чат.
6 типов сообщений (каждый с эмодзи-префиксом и цветовым бейджем в админке):
| Тип | Эмодзи | Когда использовать |
|---|---|---|
| 🚨 Срочно | URGENT | Требует немедленной реакции |
| ⚠️ Важно | IMPORTANT | Требует внимания, но не срочно |
| ℹ️ Информация | INFO | Общие новости, нейтральные сообщения |
| 📅 Напоминание | REMINDER | Про даты, события, дедлайны |
| 🎉 Праздник | HOLIDAY | Поздравления |
| 🙏 Благодарность | THANKS | Отметить хорошую работу |
В форме создания:
- Селектор типа с цветовыми бейджами в индексе.
- Заголовок (опц.) — отдельная акцентная строка после префикса.
- Текст сообщения (textarea, 8 строк).
- Панель быстрой вставки 21 иконки (⚠️❗🚨💡✅❌📌📅🕐👥🏥🧹💉🔧🎉🙏📢🔥📋🌅🌙) — клик вставляет в позицию курсора и эмитит
input, превью сразу пересчитывается. - Live-превью — pre-блок, показывающий финальный текст «как уйдёт в MAX», синхронизируется с типом/заголовком/телом в реальном времени.
- Время отправки (
scheduled_at) с date-time picker. По дефолту — «сейчас», крон возьмёт через минуту. - Опциональный
chat_idдля отправки в чат, отличный от дефолтного из.env.
Жизненный цикл: pending → sent (успешно) или pending → failed (с error_message). Можно отменять (статус cancelled).
Доступ — super-admin (полный) + Admin (без удаления).
MAX-настройки в .env
Добавлен блок в config/services.php (см. ниже какие переменные нужно завести).
Технические детали
- Таблицы:
max_notification_log(с UNIQUEdedup_key),max_announcements(со связью с пользователем-автором черезcreated_by). - Eager-load: в
MaxAnnouncementResourceподключёнprotected $with = ['author']— без него падалLazyLoadingViolation, т.к. в проекте включёнpreventLazyLoading. - Версия в конфиге:
1.4.0 → 1.5.0.
Миграции
Релиз требует php artisan migrate:
2026_05_30_090727_create_max_notification_log— лог отправок с UNIQUEdedup_key.2026_05_30_091735_create_max_announcements— таблица объявлений + 8 RBAC-permissions для MaxAnnouncementResource (super-admin получает полный набор, Admin — безforceDelete/massDelete/restore).
Открытые вопросы (на будущее)
Многие пункты из backlog/notifications.md сюда не вошли — в первом этапе только односторонняя рассылка в общий чат:
- Webhook (вход. сообщения, привязка пользователей через
/start <код>, inline-кнопки). - Личные уведомления конкретным сотрудникам (нужна связка
responsible_user → cabinet). - Чаты отделений (отдельный групповой чат на
StructuralUnit). - Серии ЭЦП-сбоев и аномалии в аудите.
- Тихие часы и rate-limit per-user.