О платформе
Платформа «Перечень 2026» предназначена для сбора, проверки и обработки перечней
медицинских изделий от учреждений здравоохранения Гродненской области.
Система позволяет организациям загружать свои перечни в формате Excel,
отслеживать статус проверки, а администраторам — управлять пользователями,
формировать сводные отчёты и экспортировать данные.
Разработка платформы ведётся с 2026 года. Система построена на собственной
архитектуре MVC на нативном PHP с интеграцией Telegram-уведомлений.
Информация о системе
Версия платформы2.23.2
Версия PHP8.3.32
База данныхMySQL (ipdby_medtech_2026)
АвторизацияBcrypt + Remember Me (3 года)
УведомленияTelegram
Полезные ссылки
История версий
v2.23.2
от 2026-07-28 PATCH
- **`config/app.php`** — глобальная функция `e(?string $str, string $default = ''): string`. Циклически декодирует HTML-сущности (любой уровень вложенности), затем экранирует через `htmlspecialchars()` для безопасного вывода
- **`views/pages/perechen/admin-user-files.php`** — `htmlspecialchars()` заменён на `e()` для имени пользователя и названия организации (строки 10, 20)
- **`views/pages/perechen/export.php`** — `htmlspecialchars()` заменён на `e()` для названий организаций в фильтре и таблице (строки 129, 137, 242)
- **`views/pages/perechen/admin-files.php`** — `htmlspecialchars()` заменён на `e()` для названий организаций в фильтре и таблице (строки 65, 138-139)
- **`views/pages/perechen/admin-orgs.php`** — `htmlspecialchars()` заменён на `e()` для названий организаций (строка 190)
- **`views/pages/perechen/org_exports.php`** — `htmlspecialchars()` заменён на `e()` для названий организаций (строка 62)
- **`config/app.php`** — версия: 2.23.2
- --
v2.23.1
от 2026-07-28 PATCH
- **`views/pages/perechen/export.php`** — удалён таб «Сводный перечень» (`?tab=reports`); табы переведены на `display:inline-flex;align-items:center;gap:6px`; иконки увеличены с 16×16 до 18×18; убран `margin-right` у SVG; обновлены подсказки
- **`app/Controllers/AdminPerechenController.php`** — при `?tab=reports` выполняется редирект на `?tab=files`; редиректы после `action=generate` и `generateConsolidated()` теперь ведут на `?tab=files` вместо `?tab=reports`
- **`config/app.php`** — версия: 2.23.1
- --
v2.23.0
от 2026-07-28 MINOR
- **Новый пункт меню «Перечни организаций»** — в сайдбаре после «Экспорт в 1С». Страница с кнопкой «Сформировать перечни для всех организаций» и историей сформированных файлов
- **`AdminOrgExportsController`** — новый контроллер с методами `index()`, `generate()`, `download()`
- **Таблица `p2026_org_exports`** — хранит информацию о сформированных перечнях для каждой организации: id организации, имя, имя файла, размер, количество позиций, версия шаблона, кто сформировал, дата
- **Генерация per-org файлов** — для каждой организации с данными (`parsed_items > 0`) формируется отдельный файл `Perechen_1C_{OrgName}_{date}.xlsx` через `ExcelService::generateFlat1C()` с указанием имени файла
- **Логирование** — каждое создание перечня логируется в `p2026_status_log` с action `org_export_1c`
- **`app/Services/ExcelService.php`** — `generateFlat1C()` теперь принимает опциональный 5-й параметр `?string $outFilename = null`. Если передан, файл сохраняется с указанным именем вместо автоматического. Обратная совместимость полная
- **`index.php`** — 3 новых роута: GET `/admin/perechen/org-exports/`, POST `/admin/perechen/org-exports/generate/`, GET `/admin/perechen/org-exports/download/{id}`
- **`views/layouts/main.php`** — добавлен пункт меню «Перечни организаций» с иконкой файла
- **`views/pages/perechen/org_exports.php`** — новая страница с кнопкой генерации, flash-сообщениями, таблицей истории и боковой панелью с описанием
- --
v2.22.1
от 2026-07-28 PATCH
- **`app/Controllers/AdminReportsController.php`** — `generate()` теперь использует те же данные, что и 1C export (файлы с `parsed_items > 0`, один на организацию, приоритет `included_in_report`), вызывает `ExcelService::generateFlat1C()` вместо `generateConsolidatedReport()`, сохраняет версию шаблона в `p2026_exports.template_version`
- **`views/pages/reports/index.php`** — заголовки, шаги и текст переведены на 1С-тематику. Кнопка «Сформировать отчёт» → «Сформировать перечень для 1С». Добавлена кнопка «Скачать шаблон 1С». Кнопка «Параметры» ведёт на `/admin/perechen/export/`
- **`views/layouts/main.php`** — пункт сайдбара «Сводные отчёты» → «Экспорт в 1С`
- --
v2.22.0
от 2026-07-28 MINOR
- **auto_login теперь работает** — в `Auth::tryRememberMe()` добавлена проверка `AND auto_login = 1` в SQL-запросе. Теперь если пользователь отключил «Входить без пароля», автоматический вход не сработает, даже если remember_token сохранился в БД (например, после переключения между аккаунтами через switch)
- **clearRememberCookie() при logout** — исправлено, что при logout'е через `/login/forget/{id}` (удаление своего аккаунта) кука remember_me гарантированно чистится
- **`/login/forget/{id}`** — удаляет аккаунт из списка известных (`p2026_auth_known_accounts`) + очищает remember_token в БД. Если удаляемый аккаунт — текущий в сессии, происходит полный logout
- **`/login/logout-all/`** — очищает все известные аккаунты для device_id, все remember_token в БД, полный logout. Все аккаунты выходят, при следующем визите нужно вводить пароль
- **Кнопка «×»** в свитчере (профильное меню) — для каждого известного аккаунта (кроме текущего) появилась иконка удаления из списка
- **Кнопка «Выйти из всех аккаунтов»** на странице `/login/` — отображается когда пользователь уже в системе и когда показывает список известных аккаунтов
- **`app/Middleware\Auth.php`** — `tryRememberMe()`: SQL добавлено `AND auto_login = 1`
- **`app/Controllers/AuthController.php`** — новые методы `forgetAccount()` (POST /login/forget/{id}) и `logoutAll()` (POST /login/logout-all/)
- **`index.php`** — 2 новых роута
- **`views/layouts/main.php`** — в свитчере аккаунтов добавлена кнопка «×» для удаления
- **`views/pages/login.php`** — добавлена кнопка «Выйти из всех аккаунтов» для обоих сценариев (авторизован / список известных)
- --
v2.21.2
от 2026-07-28 PATCH
- **Баг сохранения auto_login** — чекбокс заменён на `.switch`-переключатель с `input[type=hidden]`, который всегда отправляет `0` или `1`. Теперь переключение реально работает (ранее сервер не видел `$_POST['auto_login']` при снятой галочке)
- **help-popup подсказки** — убрано `overflow:hidden`, обрезавшее тень; добавлена стрелка `::after`; добавлено закрытие по клику вне попапа
- **`views/pages/settings/user/security.php`** — чекбокс (строка 45) заменён на `.switch-row` с `toggleSwitch()` JS; скрытый `input[name=auto_login]` + inline CSS для стрелки попапа + скрипт закрытия попапа по клику вне
- --
v2.21.1
от 2026-07-28 PATCH
- **Табы пользовательских настроек** — страница `/settings/` разделена на 4 вкладки с отдельными URL: Учётная запись (account), Уведомления (notifications), Внешний вид (appearance), Безопасность (security)
- **Самостоятельное управление auto-login** — пользователь может включить/отключить автоматический вход на вкладке «Безопасность». При отключении remember_token очищается, при следующем входе потребуется пароль
- **Помощь (help popup)** — на вкладке безопасности для раздела «Автоматический вход» добавлен вопросительный знак с подсказкой
- **`SettingsController`** — полностью переписан: добавлены методы `account()`, `notifications()`, `appearance()`, `security()`, `update()`. Старый `index()` удалён. Admin-пользователи по-прежнему редиректятся на `/admin/settings/`
- **`index.php`** — добавлены 4 GET-роута для вкладок и 1 POST-роут для обновления настроек
- **`views/pages/settings/user/`** — новая папка с 5 файлами: `_tabs.php`, `account.php`, `notifications.php`, `appearance.php`, `security.php`
- **`views/pages/settings.php`** — больше не используется (можно удалить в следующей итерации)
- Автоматический вход (auto-login) теперь можно отключить от имени пользователя, а не только от администратора. Ранее на вкладке «Безопасность» был только декоративный переключатель `.switch.on` без функционала
- Затронутые файлы: SettingsController.php, index.php, config/app.php, views/pages/settings/user/*, changelog.md
- Версия: 2.22.0 → 2.21.1
- --
v2.22.0
от 2026-07-28 MINOR
- **Табы редактирования пользователя** — страница `/admin/users/edit/{id}` разделена на 4 вкладки с отдельными URL: Основное (main), Контакты (contacts), Настройки (settings), Безопасность (security)
- **Вкладка «Безопасность»** — новый раздел с блоками:
- **Колонка `auto_login`** в `p2026_users` (TINYINT, default 1) — хранит настройку автоматического входа для каждого пользователя
- **`AdminUsersController`** — добавлены методы: `editContacts()`, `editSettings()`, `editSecurity()`, `clearSessions()`. `edit()` теперь рендерит вкладку «Основное». `update()` поддерживает `_tab` для редиректа и `auto_login` для управления remember_token
- **`REMEMBER_ME_LIFETIME`** — изменён с 86400 * 365 * 3 (~3 года) на 86400 * 180 (~6 месяцев)
- **`index.php`** — добавлены 4 новых роута для вкладок and clear-sessions
- Затронутые файлы: AdminUsersController.php, index.php, config/app.php, _tabs.php, edit_main.php, edit_contacts.php, edit_settings.php, edit_security.php, changelog.md, p2026_users (auto_login column)
- Версия: 2.20.0 → 2.22.0
- --
v2.20.0
от 2026-07-28 MINOR
- **Account Switcher на странице входа** — при повторном посещении login-страницы пользователь видит список ранее использованных аккаунтов в виде карточек: аватар (первая буква имени), имя, логин, организация, роль. Клик по карточке — мгновенный вход без пароля
- **Кнопка «+ Другой аккаунт»** — скрывает список аккаунтов и показывает стандартную форму входа с логином и паролем
- **Переключение аккаунтов внутри системы** — в профильном меню (правый верхний угол) добавлен раздел «Сменить пользователя» со списком всех известных аккаунтов. Переключение в один клик
- **Таблица `p2026_auth_known_accounts`** — хранит связку device_id ↔ user_id, позволяя использовать несколько аккаунтов на одном устройстве
- **Device ID cookie** — персистентный идентификатор устройства (5 лет), связывающий все известные аккаунты
- **Страница входа** — полный редизайн: Google-style карточки аккаунтов, скрываемая форма входа, адаптация под пустой список (стандартная форма)
- **AuthController** — добавлен метод `switchAccount()` для бесшовного переключения, логика сохранения известных аккаунтов
- **Auth middleware** — добавлены методы: `getDeviceId()`, `saveKnownAccount()`, `getKnownAccounts()`
- **Профильное меню** — динамический список известных аккаунтов для быстрого переключения
- Переключение между аккаунтами работает только для device_id, который ранее использовал этот аккаунт — проверка `p2026_auth_known_accounts`
- Device ID генерируется как `bin2hex(random_bytes(32))` — 64 символа, криптостойкий
- При logout'е device_id сохраняется (аккаунты остаются известными)
- Затронутые файлы: AuthController.php, Auth.php, login.php, main.php, index.php, p2026_auth_known_accounts
- Версия: 2.19.0 → 2.20.0
- --
v2.19.0
от 2026-07-28 MINOR
- **SemVer-версионирование шаблонов** — при загрузке нового шаблона администратор выбирает тип изменения (PATCH / MINOR / MAJOR), следующая версия рассчитывается автоматически на основе текущей активной
- **Переименование шаблона** — администратор может задать читаемое имя шаблона (например, «Перечень 2026 v3 — июль»), отображаемое в интерфейсе
- **История версий** — полная история загруженных шаблонов с возможностью скачивания любой предыдущей версии и переключения активного шаблона
- **Связь шаблон ↔ 1С** — при формировании экспорта 1С или сводного отчёта текущая версия активного шаблона записывается в `p2026_exports.template_version` и отображается в логе
- **FATAL ERROR: Unknown column 'original_name'** — таблица `p2026_templates` была добавлена с неполным набором полей; добавлены `original_name`, `file_size`, `uploaded_by`, `description`, `uploaded_at`
- **Таблица `p2026_exports`** — добавлено поле `template_version VARCHAR(20)` для связи экспорта с версией шаблона
- **Шаблон активации** — старые шаблоны не удаляются; администратор может вернуться к любой предыдущей версии
- **Клиентский интерфейс** — отображается версия активного шаблона и дата загрузки
- Затронутые файлы: AdminPerechenController.php, admin-template.php, index.php (routes), p2026_templates, p2026_exports
- Версия: 2.18.3 → 2.19.0
- --
v2.18.3
от 2026-07-28 PATCH
- **Устранена ошибка FK constraint 1452** — при вводе неверного пароля сайт возвращал ошибку 500 вместо корректного сообщения «Неверный логин или пароль». Исправлен nullable-тип в логировании авторизации
- **Проблема «клиент не может войти как другой пользователь»** — конечный пользователь оказывался «залипшим» под учётной записью администратора из-за автоматического входа. Страница входа теперь всегда отображается с блоком «Вы вошли как ...» и кнопкой «Выйти»
- **Сохранение логина при ошибке** — поле «Логин» сохраняет введённое значение при неудачной попытке входа
- **Чекбокс «Запомнить меня»** — опциональный параметр; cookie для автоматического входа создаётся только по явному согласию пользователя
- **Блок «Вы вошли как ...»** — при автоматическом входе через cookie на форме отображается текущий пользователь с кнопкой «Выйти»
- **Деплой test → dev (стейдж)** — выполнен перенос актуального кода и данных из тестового окружения в стейдж-окружение
- Затронутые файлы: AuthController, Auth middleware, login.php, config/app.php
- Версия: 2.18.0 → 2.18.3
- --
v2.18.0
от 2026-07-21 MINOR
- **Тестовое окружение на Laravel Herd** — развёрнуто полноценное тестовое окружение на локальном компьютере с использованием Laravel Herd (PHP 8.4). Тестовый стек: MariaDB 10.11.11, порт 3306, БД `ipdby_medtech_2026_test` (16 таблиц, 67 пользователей)
- **Трёхуровневая архитектура деплоя** — внедрена модель local → dev → prod с автоматическим определением окружения через hostname. Каждое окружение имеет свою БД, настройки и файл `.env`
- **Автоматические бэкапы VDS** — настроен ежедневный бэкап (cron 03:00) с ротацией 7 дней. Бэкапы: база данных + uploads + конфигурация
- **Страница версий** (`/admin/settings/versions/`) — добавлена страница с полной историей изменений платформы в формате changelog, доступная из панели администратора
- **Отладка PHP-окружения** — добавлена константа `ASSET_URL` в `public/index.php` для корректной работы статических ресурсов в тестовом окружении
- **Конфигурация подключения к БД** — исправлена критическая ошибка с оператором Elvis. Ранее пустая строка в `.env` интерпретировалась как falsy и переключалась на production-пароль. Замена на явную проверку на null для всех 4 параметров
- **Пути к статическим ресурсам** — исправлены relative-пути в шаблонах для кроссплатформенной совместимости
- --
v2.17.2
от 2026-07-09 PATCH
- **Эмодзи заменены на SVG-иконки** — на странице безопасности все HTML-entity-эмодзи заменены на inline SVG-графику. Каждая иконка — минималистичный векторный рисунок
- **Динамическая окраска рекомендаций** — блоки рекомендаций отражают фактическое состояние переключателя. Четыре статуса: серый (нейтральная), зелёный (всё верно), жёлтый (отклонение), красный (критическое). При переключении цвета меняются мгновенно
- **CLI health-check: исправлена проверка настроек** — скрипт проверки здоровья теперь использует env-специфичные настройки вместо глобальных
- --
v2.17.1
от 2026-07-09 PATCH
- **Увеличены шрифты** — все мелкие элементы переведены на более читаемые размеры (13–18px вместо 11–15px)
- **Переработан блок рекомендаций** — вместо мелкого серого italic теперь тёмный текст на светлом фоне с цветным бордером (зелёный для обычных, красный для критических)
- **Улучшена структура** — заголовки окружений увеличены, заголовки секций выделены жирным,.footer структурирован строками
- --
v2.17.0
от 2026-07-09 MINOR
- **Env-специфичные настройки** — новая функция `envSetting()` проверяет переменные окружения с префиксом `SETTING_`. Приоритет: env → БД (миграция с версий < 2.16.0)
- **Рекомендации на странице безопасности** — для каждого переключателя в трёх блоках (DEV/TEST/PROD) добавлены цветные подсказки: что рекомендуется включить/выключить. Критические рекомендации подсвечены красным
- **Env-специфичные уведомления** — `notify_fatal_telegram`, `health_check_telegram`, `health_check_email`, `health_check_cli_enabled` переведены на env-префиксную архитектуру
- --
v2.16.0
от 2026-07-09 MINOR
- **Environments — контекстные настройки безопасности** — на странице «Настройки → Безопасность» отображаются три блока: «Локальная», «Тестовая», «Продакшн» — с собственными переключателями
- **Функция `envSetting()`** — глобальная функция-обёртка над `setting()`, автоматически подставляющая префикс окружения для env-специфичных настроек
- **ErrorHandler::loadConfig()** — переведён с `setting()` на `envSetting()` — на production ошибки логируются/показываются в соответствии с настройками production
- **UI** — три визуальных блока с цветовой индикацией (зелёный — local, жёлтый — staging, красный — production). Текущее окружение подсвечено
- --
v2.15.4
от 2026-07-09 PATCH
- **Настройка `health_check_cli_enabled`** — на вкладке «Уведомления» добавлен переключатель для отключения CLI-скрипта проверки здоровья. На локальном хостинге скрипт работает в тихом режиме
- **Шрифт на страницах Health Report** — размер текста увеличен с 13px до 15–16px для статистики, процентов и категорий
- **PowerShell-команда** — добавлены флаги для скрытого запуска без всплывающего окна
- --
v2.15.3
от 2026-07-09 MINOR
- **PSR-3 + Monolog в ErrorHandler** — ErrorHandler реализует `Psr\Log\LoggerInterface` с Monolog `StreamHandler` (файл лога) и `TelegramBotHandler` (критические ошибки в Telegram)
- **Плавная анимация collapsible** — collapsible-блоки на страницах Dashboard и Health теперь открываются и закрываются плавно через CSS transition
- **Collapsible-блоки больше не зависают в открытом состоянии** — убран inline onclick, дублировавший глобальный обработчик
- **ErrorHandler** — статические helper-методы `info()`, `warn()`, `error()`, `sync()` удалены. Логирование переведено на instance-методы
- --
v2.15.2
от 2026-07-08 PATCH
- **Конфликт ErrorHandler и Logger** — в `index.php` последовательно вызывались `ErrorHandler::init()` и `Logger::replaceErrorLog()`. Второй вызов перезаписывал обработчики первого. Все ошибки уходили не в тот лог. Исправлено: ErrorHandler::init() вызывает Logger::replaceErrorLog() внутри себя
- **Неверная проверка в ErrorHandler::write()** — метод проверял `log_system_events` вместо `log_php_errors`. PHP-ошибки не записывались, даже когда логирование было включено
- **Collapsible-секции Health Check** — CSS `max-height: 0 !important` заменён на вычисление `scrollHeight` через JS. При закрытии высота принудительно устанавливается в 0 через requestAnimationFrame
- --
v2.15.1
от 2026-07-08 PATCH
- **Collapsible: цифры статистики больше не исчезают** — некорректный CSS-селектор выбирал внутренний span с цифрами вместо стрелки. Заменён на корректный выбор дочернего элемента
- --
v2.15.0
от 2026-07-08 MINOR
- **Сохранение Health Check в Markdown** — новая кнопка «Скачать Markdown» на странице Health Check Dashboard. Файл сохраняется локально для последующего анализа
- **Новая вкладка «Health Check»** — Health Check Dashboard выделен из раздела «Синхронизация» в отдельный пункт меню
- **UI Health Check Dashboard** — ширина колонки «Рекомендации» увеличена, шрифт увеличен, цвет заменён для лучшей читаемости
- --
v2.14.2
от 2026-07-08 PATCH
- **Общие настройки больше не сбрасываются в 0** — метод `update()` теперь сохраняет только те поля, которые присутствуют в `$_POST`. Раньше при сохранении любой вкладки все остальные настройки затирались значением `'0'`
- **Значения настроек в БД** — исправлены с `'0'` на корректные после предыдущего бага
- **Health Check — Email-уведомления** — новый переключатель «Health Check — уведомления на Email» в разделе «Проверка здоровья»
- **SMTP-настройки в `.env`** — добавлены переменные для SMTP/IMAP. Сервис почты при наличии настроек в `.env` использует их вместо БД
- --
v2.14.1
от 2026-07-08 PATCH
- **Локальный сайт после перезагрузки ПК** — старт OSPanel добавлен в автозагрузку. Исправлен `config/database.php` для корректного подключения к локальной БД
- **Telegram-уведомления** — в первую строку сообщения добавлен домен сайта для идентификации источника события
- --
v2.14.0
от 2026-07-08 MINOR
- **Health Check CLI + Windows Task Scheduler** — CLI-скрипт для периодической проверки `/health/` endpoint. Задача создана в планировщике Windows (каждые 5 минут)
- **Health Check endpoint `/health/`** — JSON-диагностика: окружение, БД, пользователь, все проверки. Без авторизации
- **Настройки Health Check в админ-панели** — вкладка «Уведомления»: блок «Проверка здоровья» с переключателями Telegram/Email уведомлений
- **Секреты перенесены в `.env`** — Telegram-токен и Chat ID перенесены из hardcoded-значений в переменные окружения
- --
v2.13.2
от 2026-07-08 PATCH
- **Переключатели теперь работают корректно** — удалены inline-скрипты из шаблонов настроек, которые дублировали глобальный обработчик и вызывали double-fire (оба обработчика срабатывали одновременно, возвращая значение обратно)
- **Обработка ошибок fetch в toggle** — при ошибке сохранения переключатель возвращается в исходное состояние с toast-уведомлением
- --
v2.13.1
от 2026-07-08 PATCH
- **Переключатели в настройках работают** — во всех вкладках («Уведомления», «Безопасность») переключатели отправляют AJAX-запрос при клике — не требуется нажимать «Сохранить изменения»
- --
v2.13.0
от 2026-07-07 MINOR
- **Health Check v2 — 44 проверки** — новый конфиг `config/health.php` с функциями `fullHealth()`, `health()`, `healthSummary()`, `healthByCategory()`
- **Dashboard v2** — группа Health Check с collapsible-секциями, цветовые индикаторы, колонка «Оптимально» и «Рекомендация», проценты здоровья
- **Monolog (PSR-3)** — структурное логирование с 5 каналами: platform, migration, auth, mail, error. Каждый канал пишет в отдельный файл. Каналы error/migration/auth отправляют критические ошибки в Telegram
- **PHP-DI (PSR-11)** — контейнер внедрения зависимостей для MigrationService, EmailService и 4 логгеров
- **PHPStan level 2** — статический анализ кода. Прогон: 0 ошибок
- **PHP (12)** — версия, memory_limit, max_execution_time, OPcache, расширения
- **База данных (6)** — подключение, версия MySQL, кодировка, движки, размер БД
- **Безопасность (9)** — APP_ENV, APP_DEBUG, HTTPS, cookie, защита .env
- **Почта (3)** — PHPMailer установлен, SMTP настроен, from-адрес
- **Файловая система (6)** — директории, свободное место, vendor/
- **Окружение (5)** — версия платформы, часовой пояс, ОС
- **Производительность (3)** — gzip, session, output_buffering
- **Duplicate constant warnings** — убраны `@define()` в health.php, константы перенесены перед include
- **Telegram-404 crash** — обёрнуты вызовы Logger в try-catch — при невалидном токене страница не падает
- --
v2.12.1
от 2026-07-07 PATCH
- **phpMyAdmin** — создан проект в локальном окружении с отдельным доменом для доступа к БД через веб-интерфейс
- --
v2.12.0
от 2026-07-07 MINOR
- **Отдельные маршруты для каждой вкладки настроек:**
- **Hash-навигация заменена на URL-навигацию** — вкладки переключаются через `<a href>`, каждая доступна по прямой ссылке
- **Созданы 7 новых view-файлов** с общей навигацией `_tabs.php`
- **7 новых методов в AdminSettingsController** — каждый загружает свой шаблон и передаёт параметры
- --
v2.11.0
от 2026-07-07 MAJOR
- **Vite 8.1.3** — dev-сервер с HMR, production-сборка в `public/dist/`
- **Tailwind CSS v4** — установлен через @tailwindcss/vite-плагин. Доступны все Tailwind-утилиты прямо в PHP-шаблонах
- **PHP-хелпер для Vite** — функции `vite_tags()`, `vite_asset()`, `vite_is_dev()` для переключения между dev и production
- **Система сборки** — статические CSS/JS-файлы заменены на Vite с динамической загрузкой через manifest
- **Входные точки** — `resources/css/main.css`, `resources/css/admin.css`, `resources/js/app.js`
- --
v2.10.0
от 2026-07-07 MINOR
- **Off-canvas мобильное меню** — сайдбар превращается в выдвижную панель с затемнённым оверлеем. Открывается по hamburger-кнопке, закрывается по ✕, тапу на оверлей или resize
- **5 адаптивных breakpoints:** `>1600px` (крупные), `1025-1600px` (десктоп), `769-1024px` (планшеты), `481-768px` (portrait), `<=480px` (телефоны)
- **Desktop-коллапс** — кнопка сворачивания сайдбара видна только на >768px
- **CSS-переменные для responsive** — все breakpoints и правила собраны в `main.css`
- **Layout** — добавлены sidebar-header, hamburger, overlay, topbar-left
- **JS** — логика мобильного меню (hamburger, оверлей, close, resize handler, авто-закрытие при навигации)
- --
v2.9.1
от 2026-07-07 PATCH
- **Раздел «Перечень»** — все вкладки переведены на CSS-переменные и адаптированы под тёмную тему
- **Исправлены инлайн-цвета** в dashboard.php и admin.css
- --
v2.9.0
от 2026-07-07 MINOR
- **Тема оформления (светлая/тёмная)** — переключатель на вкладке «Внешний вид». Изменение применяется мгновенно через `data-theme` атрибут и CSS-переменные
- **CSS-переменные для тем** — `--log-bg`, `--log-header-bg`, `--log-text`, `--log-muted` определены для обеих тем
- **Страница `/admin/logs/`** — эмодзи заменён на SVG-иконку; все inline-цвета заменены на CSS-переменные
- --
v2.8.1
от 2026-07-07 PATCH
- **Страница `/admin/logs/` больше не пустая** — `AdminLogsController::index()` не выводил результат. Добавлен вывод через `echo view('layouts/main', ...)`
- --
v2.8.0
от 2026-07-07 MINOR
- **EmailService** — новый сервис с методами: `send()` (SMTP + mail fallback + логирование), `testSmtp()`, `testImap()`, `log()`, `getLog()`, `getTemplates()`, `saveTemplate()`, `profileConfig()`, `statusHtml()`
- **Почтовые профили** — два профиля: «Локальный хостинг» и «Виртуальный хостинг» — каждый со своими SMTP и IMAP настройками
- **История отправки писем** — таблица `p2026_email_log` — логируются все попытки отправки (SENT, SMTP_FAIL, MAIL_FAIL)
- **Шаблоны писем** — таблица `p2026_email_templates` с шаблонами `fatal_error` и `login_notify`
- **Индикаторы статуса** — «SMTP настроен/не настроен», «IMAP настроен/не настроен» для каждого профиля
- **Кнопки проверки SMTP и IMAP** для каждого профиля
- --
v2.7.1
от 2026-07-07 PATCH
- **Настройки IMAP** — хост, порт, шифрование, логин, пароль
- **Тип хостинга** — переключатель «Локальный / Виртуальный» с автоматической подстановкой рекомендуемых параметров
- **Проверка IMAP** — кнопка «Проверить IMAP-соединение» с AJAX-результатом
- --
v2.7.0
от 2026-07-06 MINOR
- **SMTP-настройки в интерфейсе** — новая вкладка «Почта» с полями хост, порт, логин, пароль, шифрование
- **PHPMailer** — установлен через Composer, `sendEmail()` переписан на SMTP с fallback на `mail()`
- **Rate-limiting FATAL-уведомлений** — не чаще 1 раза в 300 секунд, предотвращение спама при циклических ошибках
- **Мгновенное сохранение переключателей** — AJAX-запрос при клике, без нажатия «Сохранить»
- **Переключатели в настройках** — теперь визуально остаются в положении после клика
- --
v2.6.0
от 2026-07-06 MINOR
- **PHPStan — статический анализ кода** — установлен через Composer, создан конфиг (level 1), прогон: 0 ошибок
- **Автоматическая отправка FATAL-ошибок в Telegram** — при критической ошибке отправляется сообщение с сайтом, текстом, файлом и строкой
- **Автоматическая отправка FATAL-ошибок на email** — HTML-письмо с данными об ошибке
- **Переключатели** «Telegram — критическая ошибка» и «Email — критическая ошибка» в настройках
- Исправлены 3 ошибки в DashboardController и ExcelService
- --
v2.5.1
от 2026-07-06 PATCH
- **Сохранение переключателей логирования** — добавлены ключи в контроллер
- **Порядок пунктов меню** — «Обращения в поддержку» перенесено в раздел «Пользователи», «Логи ошибок» — в «Систему»
- **Вкладки синхронизации** — добавлена hash-навигация; первая вкладка «Обзор» активна по умолчанию
- **Путь загрузок** — отображается моноширинным шрифтом с word-break для длинных путей
- --
v2.5.0
от 2026-07-06 MINOR
- **ErrorHandler** — перехватывает PHP-ошибки и исключения, записывает в лог с уровнями INFO / WARNING / ERROR / FATAL / SYNC
- **Раздел «Логи ошибок»** (`/admin/logs/`) — просмотр лога в стиле терминала, фильтр по уровню, скачивание и очистка
- **Настройки логирования** — 4 переключателя: PHP-ошибки, события системы, операции синхронизации, показ ошибок
- **Вкладка «Архитектура CI/CD»** — текущая и целевая схема деплоя, скрипты, подключения, дорожная карта
- --
v2.4.0
от 2026-07-06 MINOR
- **MigrationService** — сканирует папку `database/migrations/`, отслеживает применённые миграции, применяет по одной или все
- **Раздел «Синхронизация»** (`/admin/sync/`) с 4 вкладками:
- **Первая миграция** — `V1__create_migrations_table.sql`
- --
v2.3.0
от 2026-07-06 MINOR
- **Режим обслуживания** — middleware блокирует доступ не-администраторам при наличии файла `maintenance.flag`
- **Вкладка «Развёртывание»** — статус площадок, кнопки включения/выключения режима обслуживания
- **PowerShell-скрипты** — автоматизация переноса dev → prod с бэкапом и проверкой
- **Инструкция по развёртыванию** — подробный порядок действий (7 шагов)
- --
v2.2.6
от 2026-07-06 PATCH
- **Синтаксическая ошибка** — неэкранированный обратный слеш в строковом литерале
- **Удалён мусорный файл** — резервная копия, не относящаяся к рабочей версии
- --
v2.2.5
от 2026-07-06 PATCH
- **Логирование операций с пользователями** — создание, редактирование (детализация изменённых полей), удаление
- **Журнал входов/выходов** — события авторизации попадают в общий журнал
- **Раскрывающиеся строки** — детали изменений отображаются в таблице «Поле → Было → Стало»
- **Фильтр по типу действия** — выпадающий список всех уникальных действий
- --
v2.2.4
от 2026-07-05 PATCH
- **Редактирование пользователя** — переключатели «Активен» и «Тестовый пользователь» теперь работают
- **Данные не сохранялись** — внутри основной формы была вложена форма удаления, браузер закрывал внешнюю форму. Delete-форма вынесена после закрытия основной
- **«Опасная зона»** — удаление пользователя теперь только во вкладке «Безопасность»
- --
v2.2.3
от 2026-07-04 PATCH
- **Полученные файлы** — нумерация сквозная, сортировка по всем столбцам, статус-фильтр исправлен, фильтр даты, столбец «Проверено»
- **Перечень** — увеличены шрифты и контрастность, кнопки увеличены, фильтры с сохранением параметров при пагинации
- **Кнопки действий** — новый класс `.action-btn-sm` с контрастной рамкой и увеличенным размером
- --
v2.2.2
от 2026-07-04 PATCH
- **Прогресс-бар «План кампании»** — теперь основан на времени (01.06–31.07), а не на готовности организаций
- **Воронка «Авторизованы в системе»** — показывает всех зарегистрированных клиентов
- **«Динамика за неделю»** — рассчитывается динамически на основе недельных данных
- --
v2.2.1
от 2026-07-04 PATCH
- **Шрифты** — увеличены все мелкие шрифты (8–13px → 11–15px)
- **Контраст** — затемнены серые тексты, усилены рамки и фон карточек
- **Google-стиль** — тени Material Design 3, цвета Google, шрифт Roboto
- **Pill-формы** — все кнопки, поля поиска, фильтры скруглены (border-radius: 50px)
- --
v2.2.0
от 2026-07-02 MINOR
- **Система уведомлений** — новая вкладка «Уведомления» с переключателями: Telegram — вход, загрузка файла, изменение статуса; Email — вход
- **Настройки в БД** — переключатели сохраняются в таблице `p2026_settings`, а не хардкодом
- **Хелпер-функции** `setting()` и `setSetting()` для работы с настройками с кэшированием
- **Интерфейс настроек** — убраны нефункциональные коллапс-треугольники, поля привязаны к БД
- --
v2.1.8
от 2026-07-02 PATCH
- **CSS cache busting** — добавлен `?v=filemtime(...)` к CSS-файлам
- **Динамическая версия** — версия системы вынесена в константу `APP_VERSION`
- **Полная история версий** — добавлена в changelog (начиная с 1.0.0)
- **Вкладки в настройках** — используют hash-навигацию (`#general`, `#security`, `#appearance`, `#versions`)
- --
v2.1.7
от 2026-06-27 PATCH
- **Рабочий стол (dashboard)** — воронка готовности, круг с процентом, бар-чарт, карточки быстрых действий, план кампании, узкие места, последние события
- **Перечень — Организации** — 5 карточек статистики, прогресс-бар, таблица с бейджами
- **Перечень — Полученные файлы** — 5 карточек статистики, фильтры, 3-dot меню действий, пагинация
- **CSS** — добавлены большие блока стилей `.ar-*` (таблицы/фильтры/статистика) и `.db-*` (dashboard)
- --
v2.1.6
от 2026-06-26 PATCH
- Редизайн админ-панели
- Блоки статистики, воронка готовности, бар-чарт
- --
v2.1.5
от 2026-06-20 PATCH
- Страница поддержки с формой обращений
- Telegram-уведомления о входе администраторов
- --
v2.1.4
от 2026-06-15 PATCH
- Импорт/экспорт пользователей
- Журнал действий (лог)
- --
v2.1.3
от 2026-06-10 PATCH
- Hash-навигация вкладок настроек
- Мелкие исправления интерфейса
- --
v2.1.2
от 2026-06-05 PATCH
- Раздел «Версии системы» в настройках
- Чтение changelog.md и отображение истории версий
- --
v2.1.1
от 2026-05-30 PATCH
- Роль «клиент» и интерфейс загрузки перечней
- Разграничение доступа admin/client
- --
v2.1.0
от 2026-05-20 MINOR
- Полноценная админ-панель (CRUD пользователей, организаций)
- Аутентификация с Remember Me (3 года)
- Система сессий и middleware (Router)
- --
v2.0.0
от 2026-05-01 MAJOR
- Первый публичный запуск платформы «Перечень 2026»
- Основной функционал: авторизация, загрузка/проверка файлов, формирование отчётов
- Архитектура MVC на нативном PHP
- Интеграция с Telegram
- --
v1.0.0
от 2026-04-15 MAJOR
- Первоначальная версия платформы
- Базовая архитектура, маршрутизация, шаблонизация
- Подключение к БД, конфигурация окружения