Версия 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.