Версия 1.5.0 — 2026-06-01

Версия 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.phpservices.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 → failederror_message). Можно отменять (статус cancelled).

Доступ — super-admin (полный) + Admin (без удаления).

MAX-настройки в .env

Добавлен блок в config/services.php (см. ниже какие переменные нужно завести).

Технические детали

  • Таблицы: max_notification_log (с UNIQUE dedup_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 — лог отправок с UNIQUE dedup_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.