Версия 1.6.2 — 2026-06-05

Версия 1.6.2 — 2026-06-05

QR-стикеры «Кабинет × Журнал» для физического размещения на кабинетах + важный фикс окна редактирования для двухэтапных записей.

Добавлено

QR-стикеры на каждый журнал в каждом кабинете

Новая консольная команда journals:qr-stickers генерирует печатно-готовые стикеры с QR-кодами для размещения на стенах кабинетов рядом с оборудованием (УФ-лампа, холодильник, шкаф и т.п.). Медсестра наводит камеру на QR — попадает прямо в нужный журнал, отфильтрованный по этому кабинету.

Что включено:

  • Контроллер QrLandingController и маршрут /q/{cabinet}/{journal} — короткий URL для QR. По переходу ставит активный кабинет в сессию и редиректит на индекс-страницу журнала (она автоматически фильтруется по этому кабинету через WithActiveCabinetFilter).
  • Команда генерирует:
    • HTML-лист storage/app/qr-stickers.html — A4 с сеткой 3×4 стикера, удобно печатать на обычном принтере на самоклеящейся бумаге.
    • При флаге --png — отдельные PNG-файлы в папке qr/ для термопринтера этикеток (по умолчанию 43×25 мм в обеих ориентациях: qr/landscape/ + qr/portrait/, чтобы коллега подобрал ту, что встаёт ровно на одну этикетку).
  • Логотип-знак клиники встроен в центр каждого QR (уровень коррекции H — выдерживает перекрытие).
  • Подпись: «Кабинет №N» жирно + название журнала.

Использование:

php artisan journals:qr-stickers --png                  # дефолт: 43×25 @ 406 dpi, обе ориентации
php artisan journals:qr-stickers --png --orientation=landscape
php artisan journals:qr-stickers --png --sticker-mm=50x30 --dpi=300
php artisan journals:qr-stickers --cabinet=1 --cabinet=2 # только выбранные

Исправлено

Окно редактирования: пропадал карандаш сразу после заполнения второго этапа

Симптом (со слов главной медсестры):

Заполнила лампу УФО прямо сейчас. Выставила время выключения 14:00, внесла показания и сохранила. И тут же сразу пропала кнопка «Редактировать». То есть если я ошиблась в часах и через 5 минут хочу отредактировать — уже нет возможности.

Причина: окно редактирования (по умолчанию 2 часа) отсчитывалось от created_at — момента, когда запись была создана впервые. Для двухэтапных журналов (УФ: time_on утром → time_off днём; t°/влажность: утро → вечер; холодильники: утро → вечер) к моменту внесения второго этапа окно от created_at уже истекало, и сразу после сохранения карандаш скрывался из-за isRecordFullyLocked().

Фикс: опорная дата окна редактирования в AbstractJournalIndexPage::editWindowAnchor() и AbstractJournalFormPage::editWindowAnchor() сменена с created_at на updated_at ?? created_at. После КАЖДОГО сохранения окно начинается заново — у пользователя есть 2 часа поправить опечатку независимо от того, первое это сохранение или десятое.

Для одноразовых записей поведение не меняется (updated_at == created_at сразу после создания). Для журнала генеральных уборок WithGeneralCleaningEditWindow уже использовал updated_at — там фикс применился без изменений.

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

  • Версия в config/journals.php: 1.6.1 → 1.6.2.
  • Новые файлы:
    • app/MoonShine/Controllers/QrLandingController.php
    • app/Console/Commands/JournalsQrStickersCommand.php
  • Новый маршрут: GET /q/{cabinet}/{journal}qr.landing.
  • В .gitignore добавлена папка /qr/ (PNG-стикеры — генерируемый артефакт).

Миграции

Не требуются.