Версия 1.4.0 — 2026-05-29

Версия 1.4.0 — 2026-05-29

Добавлено

Дашборд «Контроль заполнения» для главной медсестры

Новый раздел админки /page/head-nurse-dashboard-page — на одном экране показывает, какие журналы за выбранную дату не заполнены вовремя по всем кабинетам и подразделениям.

Структура:

  • Шапка с легендой цветов (красный — просрочено, жёлтый — ждёт, зелёный — заполнено, серый — срок не наступил).
  • Фильтры: дата (по умолчанию сегодня), структурное подразделение, кабинет, тип журнала.
  • Сводка-плитки: «Просрочено», «Ждёт заполнения», «Заполнено», «Срок не наступил».
  • Секции «Утро» и «Вечер» — для двухцикловых журналов (t°/влажность, холодильники, текущие уборки) с раздельным контролем утренних и вечерних замеров.
  • Секция «По плану / по событию» — генеральные уборки на сегодня и УФ-сеансы.
  • Секция «Журналы по событию (справочно)» — журналы, заполняемые только когда было событие (отходы, операции, биопсии, прививки, ПКУ и т.п.) — без алертов, только счётчик за день.

Сортировка строк в секции: красные → жёлтые. Зелёные и серые свернуты в badge-счётчики в шапке секции (нет смысла отвлекать на «всё хорошо» / «ещё рано»).

Цвет строки определяется по (заполнено?) и (текущее время vs дедлайны):

  • Не заполнено и текущее время прошло «overdue» — красный.
  • Не заполнено и текущее время прошло «warn» — жёлтый.
  • Не заполнено и срок не наступил — серый.
  • Заполнено — зелёный.
  • Для прошлых дат: всё незаполненное автоматически красное.
  • Для будущих дат: всё незаполненное автоматически серое.

Кнопка «Открыть» ведёт прямо в форму записи журнала с предзаполненным кабинетом — главная медсестра одним кликом попадает в нужную строку.

Кеш 5 минут на расчёт слотов по каждой паре (кабинет, журнал, дата). Иначе на 30 кабинетов × 5 контролируемых журналов выходит ~150 запросов на каждый рендер.

Раздел настроек «Слоты заполнения»

/resource/journal-slot-setting-resource/index-page — управление названиями слотов и дедлайнами через UI.

Каждый слот (morning, evening, day, planned, event) имеет:

  • Название — отображается в заголовке секции дашборда («Утро», «Вечер» и т.п.).
  • Жёлтый после (warn_time) — время, после которого пустой слот становится жёлтым.
  • Красный после (overdue_time) — время, после которого пустой слот становится красным.

Дефолтные значения (зашиты миграцией):

Слот Название Жёлтый Красный
morning Утро 11:00 13:00
evening Вечер 18:00 20:00
day За день 17:00 19:00
planned По плану 15:00 18:00
event По событию

Создавать и удалять слоты через UI нельзя (action=VIEW, UPDATE) — структура слотов фиксирована в коде (App\Enums\JournalSlot). Кеш настроек на 1 час с явным сбросом при сохранении записи.

Сервис per-slot статуса в CabinetJournalDailyStatus

В существующий сервис добавлен метод computeSlots(), который раскладывает журнал на отдельные слоты:

  • TEMP_HUMIDITY → две строки (утро / вечер) с проверкой measurements.morning / measurements.evening.
  • FRIDGE_TEMPERATURE → две строки (утро / вечер) с проверкой thermometers[*].morning.temperature / thermometers[*].evening.temperature.
  • CLEANING_CURRENT → две строки: до полудня (cleaned_at < 12:00) и после.
  • UV_DISINFECTION → один слот «за день»: если есть сеансы — все должны быть закрыты (есть time_off); если сеансов нет — это нормально.
  • CLEANING_GENERAL → слот «по плану» только если на дату есть план; иначе слот не возвращается.
  • Прочие журналы → слот «по событию» (справочно, без алертов).

Старый compute() сохранён без изменений — используется на странице «Обход кабинетов».

Безопасность

Доступ к дашборду

Право HeadNurseDashboardPage.viewAny создано миграцией и выдано роли super-admin. Пункт меню «Контроль заполнения» видят только те, у кого это право есть.

Дополнительно внутри страницы:

  • Если у пользователя нет роли super-admin, доступные подразделения ограничиваются через User::structuralUnits — старшая медсестра отделения видит только свои подразделения.
  • Фильтр «Подразделение» в UI содержит только разрешённые опции; если в URL пришёл unit_id вне разрешённых — он игнорируется.

Доступ к настройкам слотов

Права JournalSlotSettingResource.viewAny|view|update|... созданы той же миграцией. Полный набор выдан super-admin, а Admin получает только viewAny + update (другие роли — без доступа).

В пункте меню «Слоты заполнения» (группа «Система») установлен canSee для super-admin | Admin.

Миграции

Релиз требует php artisan migrate. Новые миграции:

  • 2026_05_29_081249_add_head_nurse_dashboard_permission — создаёт право HeadNurseDashboardPage.viewAny и выдаёт super-admin.
  • 2026_05_29_093819_create_journal_slot_settings — таблица настроек слотов, seed дефолтных значений и выдача RBAC-прав.

Обе миграции имеют рабочий down().

Технические заметки

  • App\Enums\JournalSlot — только структурное определение слотов; названия и дедлайны живут в БД и читаются через App\Services\JournalSlotSettings.
  • Из config/journals.php удалён неактуальный блок deadlines — источник правды теперь БД.
  • Версия в конфиге: 1.3.7 → 1.4.0.