Бобер Боб
Платформа складского учёта
Платформа складского учёта · Release notes

История версий

Публичный реестр изменений платформы «Бобер Боб». Каждая версия хранится в базе данных и доступна по собственной ссылке из интернета — без авторизации: заголовок, подзаголовок, описание, что сделано и какой результат это даёт.

Текущая версия — v1.14.1 (от 29.09.2026)
79
Версий в истории
v1.14.1
Текущая версия платформы
18.07.2026
Разработка начата
8.4.27
Версия PHP

О платформе

«Бобер Боб»
Автоматизация складского учёта, остатков и логистики импорта продовольствия: товары, склады, движения, Telegram-боты и ИИ-агенты в одной панели.

Разработчик

Разработка и сопровождение платформы силами внутренней команды.

Начато разработки

18.07.2026
Первая версия платформы — v0.1.0.

Технологии

Laravel + Filament
Laravel, MariaDB, Tailwind CSS. Подробности — в карточках стека ниже.

Стек платформы

PHP 8.4.27 · MYSQL (MariaDB)
ƛ
Фреймворк
Laravel 13.22.0 + Filament v5
⚙
PHP
8.4.27
🗄
База данных
MYSQL (MariaDB)
🖥
Сервер
VDS 185.66.68.122 · Ubuntu 22.04
🎨
Интерфейс
Tailwind CSS
📊
Excel
PhpSpreadsheet
💬
Уведомления
Telegram Bot API
🔐
Авторизация
Bcrypt + Spatie Permission
v1.14.1 patch Текущая от 29.09.2026
Задание 139. Кебаб-меню в Telegram-пользователях: все действия строки (Просмотр, Изменить, Удалить) в «⋮» и адаптивная таблица
Действия строки на странице «Telegram-пользователи» собраны в полноценное кебаб-меню «⋮» в конце каждой строки: Просмотр, Изменить и Удалить больше не показываются отдельными ссылками, а лежат в едином выпадающем меню. Таблица стала адаптивной с самого начала: на узких экранах скрыты второстепенные колонки — Username и Последнее сообщение появляются от md (768px), Активен — от sm (640px), Платформа и Сообщений — от lg (1024px); всегда видимы ID, Имя, Роль и Этап, поэтому горизонтальная прокрутка не возникает при ширине от планшета и выше. Версия платформы 1.14.0 → 1.14.1.

Кебаб-меню строки

  • Всё в «⋮» — Просмотр, Изменить и Удалить собраны в единое кебаб-меню в конце строки; инлайн-ссылок в строках больше нет
  • Правило методологии — на таблицах с большим числом колонок безопасные действия тоже уходят в кебаб-меню, чтобы не растягивать строку

Адаптивная таблица

  • Колонки по ширине экрана — Username и Последнее сообщение от md (768px), Активен от sm (640px), Платформа и Сообщений от lg (1024px)
  • Всегда видимы — ID, Имя, Роль и Этап; при широком окне не появляется горизонтальная прокрутка
Полная версия →
v1.14.0 minor от 29.09.2026
Задание 138. Пользователи из Telegram-переписки: загрузка в Telegram-пользователей, назначение ролей и уведомление о новом пользователе
Система собирает пользователей из Telegram-переписки (n8n-telegram admin_dump.php) и заносит их в «Telegram-пользователи»: уникальный ключ — Telegram chat_id (user_id из дампа, для бизнес-сессий — приватный чат), из переписки берутся username, число сообщений и время последней активности. Привязка пользователя теперь в первую очередь к Телеграму, а не к электронной почте: в карточке Telegram-пользователя назначается роль (админ, кладовщик, поставщик и т.д.) и связь с пользователем платформы. При появлении НОВОГО пользователя в Telegram система сообщает об этом в канал уведомлений «Новый пользователь в Telegram» (уровень «Важное», каналы: платформа и бот администратора, ссылка ведёт на карточку пользователя для назначения роли). Событие срабатывает и вживую (вебхук /webhook/ai), и при загрузке пользователей из переписки кнопкой «Загрузить из переписки» на странице /admin/telegram-users. Дубли из разных форм сессии (dm:X, dm:X_cX, голый X) схлопываются в одного пользователя; тестовые псевдонимы (test:123) и нечисловые id игнорируются. Версия платформы 1.13.0 → 1.14.0.

Пользователи из переписки

  • Загрузка из переписки — кнопка «Загрузить из переписки» на странице «Telegram-пользователи»: берёт дамп переписки включённых ботов, собирает уникальных пользователей (по Telegram chat_id) и заносит их в систему
  • Каждый, кто писал в Telegram, — в системе — из переписки переносятся username, число сообщений и время последней активности; дубли сессий разных форматов (dm:X, dm:X_cX, голый X) — один пользователь

Привязка к Telegram

  • Основное — Telegram, не email — роль и привязка к пользователю платформы назначаются в карточке Telegram-пользователя; система опирается на Telegram-идентичность

Уведомление о новом пользователе

  • «Новый пользователь в Telegram» — при появлении нового пользователя система сообщает в канал уведомлений (уровень «Важное», категория «Пользователи»): вживую через вебхук и при загрузке из переписки
  • Ссылка на карточку — уведомление ведёт на карточку пользователя, где сразу назначается роль (админ, кладовщик, поставщик и т.д.) и привязка к платформе
Полная версия →
v1.13.0 minor от 29.09.2026
Задание 137. Переписка бота: год в датах диалогов, последняя запись сверху, отдельная страница диалога с ответом оператора в единой системе
Доработка переписки бота по образцу платформы Алексея (n8n-telegram admin/chat.php): 1) во всех датах и времени диалогов добавлен год — формат ДД.ММ.ГГГГ, ЧЧ:ММ (JS formatTime и PHP), правило закреплено в методологии «даты и время всегда с годом»; 2) диалоги сортируются по последней записи — сессии с последней активностью идут сверху, сразу видно, где ведётся переписка; 3) отдельная страница диалога по прямой ссылке /admin/bot-conversation?bot=...&session=... — полная лента переписки с клиентом (кто что написал), сведения о сессии (session_id, username, user_id, число сообщений, последняя активность), ссылка «Обновить диалог» и форма ответа оператора: отправить клиенту сообщение от лица бота через n8n (админское действие operator_reply, маршрут POST /admin/telegram-bots/reply), после отправки лента обновляется. Ссылка «Открыть» добавлена к каждому диалогу в списках «Переписка бота» и на странице бота. N8nTelegramService дополнен методом replyAsOperator(). Версия платформы 1.12.0 → 1.13.0.

Год в датах

  • Формат ДД.ММ.ГГГГ, ЧЧ:ММ во всех датах диалогов — JS formatTime и PHP-вывод; правило «даты и время всегда с годом» закреплено в методологии разработки и стиле интерфейса
  • Пользователи работают с годом — на платформе и в методологии Алексей использует год в рабочих датах

Сортировка диалогов

  • Последняя запись сверху — сессии сортируются по last_at по убыванию: любой диалог, где идёт переписка, сразу виден в начале списка

Отдельная страница диалога

  • Прямая ссылка /admin/bot-conversation?bot=...&session=... — полная лента переписки с клиентом, кто что написал, сведения о сессии
  • Ответ оператора — форма отправки сообщения клиенту от лица бота через n8n (operator_reply); после отправки лента обновляется
  • Кнопка «Открыть» у каждого диалога в списках «Переписка бота» и на странице бота — переход к отдельной странице диалога
Полная версия →
v1.12.0 minor от 28.09.2026
Задание 136-2. Знания по продукту: карта «пути» чат-бота (7 этапов, как воронка/CRM), источники данных, актуальность инструкций и данных, сигнал рассинхрона платформа ↔ бот; отдельная вкладка «Переписка бота»
Новый функционал «Знания по продукту»: отдельная вкладка слева «Переписка бота» (отдельный URL /admin/bot-conversations, полная переписка сессий с ответами, автобновление) и «Знания бота» (/admin/bot-knowledge) — визуальная карта «пути» чат-бота из 7 этапов в стиле воронки/CRM (площадка онлайн, связь n8n, поток и подключение бота, мозг regex /webhook/ai или LLM, база знаний ai-kb с датами обновления инструкций, данные проекта: товары/остатки/движения и свежесть синхронизации, диалоги и ответы). Каждый этап подсвечен статусом «работает/нет, подключён/нет, пишет/отвечает, видит/не видит данные, данные актуальны/устарели» — видно, на каком этапе бот застрял. Блок «Источники данных» перечисляет, что знает бот и откуда берётся информация (n8n-база знаний ai-kb, Google-таблица из agent.meta.json, БД платформы, диалоги n8n, LLM-прокси на VDS). Сигнал актуальности сравнивает даты: обновления инструкций (Last-Modified файлов ai-kb) ↔ данные платформы (SheetConfig.last_sync_at, последние движения/правки товаров) ↔ активность диалогов — предупреждает, если платформа обновилась, а бот пользуется старыми инструкциями или мозг ещё LLM (поток не переключён на /webhook/ai). N8nTelegramService дополнен методом getKbFileInfo() (HEAD-запрос Last-Modified/Content-Length). Сервис BotKnowledgeService собирает снапшот знаний; страницы BotKnowledge и BotConversations в группе «Чаты». Версия платформы 1.11.0 → 1.12.0.

Вкладка «Переписка бота»

  • Отдельный URL /admin/bot-conversations (группа «Чаты», sort 10) — полная переписка основного бота: список сессий, разворачивание сообщений с ответами бота, автообновление
  • Ссылка с главной страницы бота — быстрый переход «Переписка →»

Вкладка «Знания бота»

  • Карта пути из 7 этапов (площадка, связь n8n, поток, мозг, база знаний, данные проекта, диалоги) — статусы ok/warn/error, как этапы воронки продаж
  • Блок «Источники данных» — что знает бот и откуда (ai-kb, Google-таблица, БД платформы, диалоги, LLM-прокси)
  • Свежесть и рассинхрон — Last-Modified инструкций ai-kb vs данные платформы vs активность диалогов; предупреждение, если бот пользуется старыми данными/LLM-мозгом

Техника

  • N8nTelegramService::getKbFileInfo() — HEAD-запрос к /ai-kb/bots/{bot}/{file} (Last-Modified, Content-Length), кэш 60 сек
  • BotKnowledgeService — сборка снапшота: этапы, источники, сигнал актуальности, свежесть данных (SheetConfig.last_sync_at, Movement/Product, диалоги)
  • Filament-страницы BotKnowledge и BotConversations в группе «Чаты»
Полная версия →
v1.11.0 minor от 28.09.2026
Задание 136. Основной Telegram-бот: отдельная вкладка слева — карточка, откуда берётся, как устроен, инструкции (правка с площадки) и диалоги
Основной чат бот (@BBmsk_admin_bot, bot_id bober-bob-client) — наконец «рабочий» и на виду. Причина жалобы клиента («бот просто здоровается и не видит данные проекта»): сейчас ответы формирует LLM-мозг на VDS (n8n-поток + база знаний ai-kb), а данные проекта живут в площадке — их знает regex-агент /webhook/ai. По заданию мозг основного бота — regex-агент площадки с данными проекта; переключение потока n8n на webhook площадки делается при публикации платформы (тестовая ipd.test не доступна из интернета). В платформе появилась отдельная вкладка слева «Бот Бобер Боб (основной)»: карточка бота (роль primary, @username, статус, ссылка перехода), блок «Откуда берётся» (n8n-telegram_ipd.by, workflow, когда подключён, таблица), схема «Как устроен» (Telegram → n8n → /webhook/ai → ответ; вопросы/ответы пишутся в диалоги), инструкции бота редактируются прямо с площадки (welcome.md, persona.md, system.md, status.md, support-clients.md — читаются с /ai-kb/bots/… и сохраняются через admin API kb_save) и живая переписка. Методология «08 ИИ-боты и Telegram» дополнена конструктором основного бота и командой подключения мозга. Версия платформы 1.10.0 → 1.11.0.

Вкладка основного бота

  • «Бот Бобер Боб (основной)» в левом меню (Чаты, /admin/bot-bober-bob) — отдельная страница именно основного бота, для показа клиенту: карточка (роль primary, @BBmsk_admin_bot, статус, ссылка перехода), версия и инстанс площадки
  • Откуда берётся: n8n-telegram (https://n8n-telegram.ipd.by), workflow_id из agent.meta.json, дата подключения, ссылка на дашборд n8n-telegram
  • Как устроен: схема потока Telegram → n8n → /webhook/ai (regex-агент с данными проекта) → ответ; пары «вопрос → ответ» агрегируются с n8n-telegram и показываются здесь
  • Диалоги: живая переписка основного бота (тот же источник admin_dump.php, автообновление)

Инструкции бота правятся с площадки

  • Пять файлов базы знаний: welcome.md, persona.md, system.md, status.md, support-clients.md
  • Чтение: GET /ai-kb/bots/bober-bob-client/{file} с n8n-telegram (raw-файлы), показ в редакторе с предупреждением о влиянии на живой бот
  • Сохранение: POST /admin/telegram-bots/kb-save → admin API n8n-telegram (action=kb_save) — инструкции применяются к живому боту на VDS
  • Регулярно обновлять: кнопка «Обновить инструкции» перечитывает файлы

Мозг бота — данные проекта

  • Проблема: бот отвечал LLM-заготовками («привет, как я могу помочь тебе сегодня») и не видел остатки/операции — данные проекта в другом месте (regex-агент площадки /webhook/ai)
  • Решение по заданию: мозг основного бота — regex-агент площадки; поток n8n должен вызывать /webhook/ai (bober-bob-платформы) с секретом N8N_WEBHOOK_SECRET
  • Ограничение теста: bober-bob.ipd.test доступен только с ноутбука — переключение потока выполняется при публикации платформы (по приказу)
  • Проверка: /webhook/ai/health (версия, агент, таблица подключена)

Реализация

  • App\Filament\Pages\MainTelegramBot — новая страница (slug bot-bober-bob, группа Чаты), view filament.pages.main-telegram-bot
  • N8nTelegramService — методы getKbFile()/saveKbFile() (чтение raw и сохранение kb_save через admin API)
  • TelegramController — kb (GET) и kbSave (POST) эндпоинты; routes/web.php — /admin/telegram-bots/kb и /admin/telegram-bots/kb-save
  • Версия платформы — 1.10.0 → 1.11.0 (config/app.php, config/instances.php, versions.json)
Полная версия →
v1.10.0 minor от 28.09.2026
Задание 135. Телеграм-боты: бот администратора с уведомлениями, один резервный, тестовый и будущий боты, ссылки перехода, раздел ботов в меню
Telegram-боты выстроены в систему ролей: основной (с которым общается клиент), бот администратора (принимает уведомления платформы — кто-то вошёл в систему, кто-то написал боту), тестовый бот, будущий бот на перспективу и один резервный. Резервных ботов вместо трёх стал ровно один — «если создавать их много, это было бы неправильно». Раздел «Телеграм боты» вынесен в левое меню (Чаты) — быстрый доступ к настройке. У каждого бота появилась настраиваемая ссылка перехода (источник, откуда приходят пользователи) — видна в карточке бота, на рабочем столе и заполняется в настройках. Уведомления платформы (вход пользователя, новое сообщение в Telegram) теперь уходят и в Telegram — на бота администратора. Версия платформы 1.9.0 → 1.10.0.

Система ботов

  • Роли ботов: primary (основной/клиентский), admin (бота администратора — принимает уведомления), test (тестовый), future (будущий/перспектива), reserve — единственный резервный
  • config/instances.php: 3 резервных → 1 (bober-bob-reserve-1), добавлены bober-bob-admin, bober-bob-test, bober-bob-future; у каждой записи поле link
  • TelegramBotConfigService: роли и метки (ROLES), adminKey()/testKey()/futureKey(), roleLabel(), reserveKeys() теперь строго роль reserve

Меню и страница ботов

  • Раздел «Телеграм боты» в левом меню (Чаты) — shouldRegisterNavigation: false → true
  • Страница ботов: бейджи всех ролей (осн./адм./тест/буд./рез.), строка «Ссылка перехода» в карточке и поле «Ссылка перехода (источник)» в настройках (сохраняется через /admin/telegram-bots/update)
  • Рабочий стол: бейджи ролей в блоке «Телеграм» + показ ссылки при её наличии

Уведомления на бота администратора

  • Вход пользователя (уже было в AppServiceProvider) — теперь с каналом telegram
  • Новое сообщение в Telegram — при вебхуке /webhook/ai создаётся уведомление категории message (кто-то написал боту: имя и первые 120 символов), канал in_app + telegram
  • Доставка в Telegram идёт через существующую интеграцию (Настройки → Уведомления), получатель открывает бота администратора
Полная версия →
v1.9.0 minor от 28.09.2026
Задание 134. Телеграм-бот — приоритетный канал: блок на рабочем столе, роли пользователей, основной и резервные боты
Telegram-бот — цель и приоритет платформы: через него автоматизируются заказы (ИИ-агент). Раньше бот был «невидим»: в меню его нет, на рабочем столе — только карточка светофора, назначение ролей скрыто, резервирования нет. Теперь на дашборде появился приоритетный блок «Телеграм»: карточки ботов (основной + 3 резервных, статус, число диалогов/сообщений, последняя активность), статистика (пользователи, активные, сообщений сегодня) и лента последней переписки — видно, кто писал, когда и что, с ролью пользователя (клиент/бот). Раздел «Telegram-пользователи» стал видимым в меню (Администрирование) — роль пользователю назначается прямо из интерфейса. Боты различаются по роли: основной (primary) и резервные (reserve, по умолчанию выключены) — включаются, если основной недоступен. На странице «Телеграм боты» роль показана бейджем «осн.»/«Резервный».

Рабочий стол — блок «Телеграм»

  • Приоритетный блок сразу после КПИ-карточек (Telegram — цель платформы, заказы через ИИ-агента)
  • Боты: карточка каждого бота — статус-точка (включён/выключен), название, @username, бейдж «Основной»/«Резерв», число диалогов и сообщений, последняя активность
  • Статистика: пользователей в Telegram, активных, сообщений сегодня
  • Лента последней переписки: кто писал (имя/username из Telegram), роль пользователя цветным бейджем, метка «клиент/бот», время и превью сообщения → все переходы на страницу переписки

Роли и боты

  • «Telegram-пользователи» показаны в меню (Администрирование): назначение роли (Тестировщик/Поставщик/Кладовщик/Складовщик/Администратор/Партнёр), активность, привязка к пользователю платформы
  • Резервирование: ботов теперь 4 (1 основной + 3 резервных по умолчанию выключены); роль бота живёт в config/instances.php (telegram_bots.role: primary/reserve) и в TelegramBotConfigService::primaryKey()/reserveKeys()
  • Страница ботов: бейдж «осн.» на вкладочках и строки «Роль» в карточке бота

Реализация

  • custom-dashboard.blade.php — блок «Телеграм — приоритетный канал» (DashboardOverview::getTelegramOverview(), данные с n8n-telegram читаются только для включённых ботов, вне тестов)
  • TelegramUserResource — shouldRegisterNavigation: false → true; AiConversation::tgUser() — связь с TelegramUser по telegram_chat_id
  • config/instances.php — 3 резервных бота (bober-bob-reserve-1/2/3); версия платформы 1.8.0 → 1.9.0
Полная версия →
v1.8.0 minor от 28.09.2026
Задание 133. SVG-иконки: крупные «живые» иконки на карточках рабочего стола (80–120px)
Иконки на карточках дашборда стали крупными выразительными «иероглифами» интерфейса: раньше они были 16px (w-4 h-4) и терялись — мелкая иконка «портит внешний вид, нечитаемая». Теперь КПИ-карточки имеют иконки 36px в подложке 56px, ячейки светофора — 28px в подложке 48px, навигация — 24px (ранее 16px). Каждая иконка «оживает» при наведении: приподнимается (-2px), подрастает (scale 1.08) пружинной кривой, а для «Движений» — мягко покачивается по смыслу (движение туда-сюда). Реализовано через CSS-классы bb-icon-live / bb-icon-shake в app.css, keyframes — только в файле токенов. Цвет иконок — по правилу «цвет по назначению»: базис серый, статус — светофор, без пёстрых палитр; обе темы (светлая/тёмная) выдержаны. Работа с иконками зафиксирована в методологии: новый файл «07 Иконки и анимация.md» (таблица размеров 12–120px по контексту, единый источник heroicons, правила анимаций, чек-лист), обновлены README методологии (1.6.0), «03 Стиль интерфейса» (п. 7.1), «04 Темы и дизайн» (п. 5a).

Иконки живут: что изменилось

  • КПИ-карточки (6): иконки 20px → 36px (w-9 h-9) в подложке 56px (w-14) rounded-xl
  • Светофор системы: иконки 16px → 28px (w-7 h-7) в подложке 48px (w-12), точка статуса — отдельно справа
  • Навигация «Разделы платформы»: иконки 16px → 24px (w-6 h-6) в подложке 40px (w-10)
  • Hover-анимация: иконка приподнимается и растёт (bb-icon-live), у «Движений» — покачивание (bb-icon-shake)
  • Обе темы выдержаны: светлая (bg-gray-100) и тёмная (dark:bg-white/10)

Методология

  • Новый файл «07 Иконки и анимация.md» — таблица размеров иконок по контексту (строки 12–16px, бейджи 16–20px, КПИ 24–28px, светофор 32–40px, акцентные 80–120px)
  • Единый источник иконок — heroicons через <x-filament::icon>, внешние наборы запрещены
  • Цвет по назначению (04 → п. 5a): базис серый, акцент светофор, без цветных иконок «просто так»
  • Анимации — микро-эффекты ≤300ms, keyframes в app.css, не инлайн; чек-лист из 6 пунктов
  • README методологии — версия 1.6.0, журнал дополнен (Задание 133)

Реализация

  • custom-dashboard.blade.php — заменены классы иконок (w-5→w-9, w-4→w-7, w-4→w-6) и подложек (w-9→w-14, w-8→w-10)
  • app.css — раздел «ИКОНКИ И АНИМАЦИЯ (задание 133)»: .bb-icon-live (transition transform 200ms cubic-bezier .34,1.56,.64,1), @keyframes bb-icon-shake-x
  • Версия платформы — 1.7.1 → 1.8.0 (config/app.php, config/instances.php, versions.json)
Полная версия →
v1.7.1 patch от 27.09.2026
Задание 132. Верхняя панель по образцу Production: поиск → колокольчик → пользователь (пользователь в крайнем правом углу)
Верхняя панель приведена к удобному порядку, как на платформе Production (Задание 132): слева направо — глобальный поиск, колокольчик уведомлений, пользователь в крайнем правом углу. Раньше колокольчик висел самым правым элементом, а подпись и аватар пользователя — левее него: «сначала значка, потом буквочка, потом администратор» было неудобно. Теперь поиск идёт первым (фильтрация товаров, паллет, складов, штрих-кодов, пользователей прямо из шапки), затем уведомления, а пользователь (аватар + имя) — строго в крайнем правом углу, как в Google-аккаунте. Реализация: колокольчик перенесён с renderHook TOPBAR_END (позиция после user-menu) на GLOBAL_SEARCH_AFTER (внутри блока topbar-end Filament, между поиском и user-menu); включён встроенный GlobalSearch Filament — добавлены getGloballySearchableAttributes()/recordTitleAttribute в ресурсах Товары, Паллеты, Склады, Пользователи, Штрих-коды; CSS-отступ колокольчика убран (отступы даёт flex-gap топбара).

Порядок верхней панели

  • Слева → направо: поиск → колокольчик уведомлений → пользователь (крайний правый)
  • Поиск первым — встроенный GlobalSearch Filament в топбаре: товары, паллеты, склады, штрих-коды, пользователи
  • Колокольчик между — рядом с поиском, слева от пользователя
  • Пользователь в углу — аватар-буква и имя (с подписью роли) в крайнем правом углу, как на Production
  • Раньше — колокольчик был самым правым (TOPBAR_END рендерился после user-menu), что было неудобно

Реализация

  • AdminPanelProvider.php — renderHook notification-bell: TOPBAR_END → GLOBAL_SEARCH_AFTER (внутрь fi-topbar-end Filament)
  • GlobalSearch включён — getGloballySearchableAttributes() в ресурсах (ProductResource, PalletResource, WarehouseResource, UserResource, BarcodeResource)
  • recordTitleAttribute — заголовки результатов поиска (name/number/code) и осмысленные URL
  • CSS — убран лишний margin-right у .bb-notif-bell; отступы между элементами — штатный flex-gap топбара (gap-x-4)
  • Версия платформы — 1.7.0 → 1.7.1 (config/app.php, config/instances.php, versions.json)
Полная версия →
v1.7.0 minor от 26.09.2026
Задание 131. Уведомления: 4 уровня критичности, YouTube-чтение, настройки пользователя, почта и Telegram — без тысяч записей
Система уведомлений переработана с нуля в полноценный механизм платформы (Задание 131): вместо тысяч сырых записей БД Filament — события с четырьмя уровнями критичности: 1 «Информация» (произошло событие), 2 «Внимание» (проактивная защита — что-то не так), 3 «Важное» (привезли товар, новый пользователь), 4 «Критично» (система упала, ошибка — глобальное уведомление всем). Открыл уведомление — автоматически прочитано, как в YouTube: красный счётчик убавляется сам, кнопок «отметить прочитанным» нет. Логируется, кто и когда просмотрел (viewed_at). Пользователь настраивает, какие уровни показывать; критичные скрыть нельзя. Одинаковые события схлопываются в одну запись с счётчиком «×N» (агрегация): импорт 222 движений даёт одно сводное уведомление — не тысячи. Каналы: внутри приложения, письмо администратору, Telegram-бот. Собственный колокольчик Livewire в шапке (вместо вендорного).

4 уровня критичности

  • 1 Информация — произошло событие: перемещение товара, добавлен товар в каталог
  • 2 Внимание — проактивная защита «что-то не так»: вход пользователя, низкий остаток, лид веб-чата
  • 3 Важное — привезли/увезли товар, создан новый пользователь, итог импорта данных
  • 4 Критично — система упала, ошибка: глобальное уведомление, приходит всем, скрыть нельзя

YouTube-семантика чтения

  • Открыл список в колокольчике — показанные уведомления автоматически помечены прочитанными
  • Кликнул строку — отмечено прочитанным + переход к событию (related_url)
  • Кнопок «прочитано» нет — циферка убавляется при просмотре, как в YouTube
  • Логирование — таблица notification_recipients.viewed_at: кто и когда посмотрел (система и ИИ-агент видят)

Настройки и каналы

  • Per-user — Настройки → Уведомления: пользователь включает/выключает уровни 1–3 (таблица user_notification_settings)
  • Email — важные (3+) и критические уведомления пишутся администратору на почту
  • Telegram — Bot Token и Chat ID администратора: важные события; критичные уходят всегда, если интеграция настроена

Агрегация вместо тысяч записей

  • group_key + окно — одинаковые события внутри окна схлопываются в одну запись с счётчиком «×N»
  • Импорт XLSX (222 движения) — одно сводное уведомление об импорте, наблюдатели на время импорта отключены
  • Не 1525 и не «каждое движение» — за день 1–5…20 событий, как нужно

Реализация

  • Таблицы — platform_notifications (уровни, категории, источники, group_key, occurrences), notification_recipients (viewed_at), user_notification_settings
  • App\Services\NotificationService — единый notify(): уровни, агрегация, маршрутизация по настройкам, каналы, markViewed
  • App\Livewire\NotificationBell — колокольчик в шапке панели (renderHook TOPBAR_END)
  • /admin/notifications — таблица с цветными бейджами уровней, авто-чтение кликом, переход к событию
  • Версия платформы — 1.6.2 → 1.7.0 (config/app.php, config/instances.php, versions.json)
Полная версия →
v1.6.2 patch от 25.09.2026
Задание 127. VDS — Кебаб меню: кнопки «Удалить» спрятаны в «⋮», чтобы не нажать случайно
Все деструктивные кнопки «Удалить» в админ-панели убраны с открытого обзора и спрятаны в кебаб-меню (вертикальные три точки «⋮»): удаление теперь в один лишний клик и защищает от случайного нажатия. Правило применено и к таблицам, и к формам редактирования: в таблицах (склады, паллеты, операции, версии, пользователи, локации, штрих-коды, остатки, товары, движения, конфиги листов, уведомления) строчная кнопка «Удалить» перенесена в кебаб-группу («⋮» в конце строки), при этом полезные действия «Просмотр»/«Изменить» и массовые действия остаются видимыми; в шапке форм редактирования (Edit-страницы) кнопка «Удалить» также свёрнута в кебаб-группу. Добавлен переиспользуемый компонент App\Filament\Actions\KebabMenu (ActionGroup с иконкой heroicon-m-ellipsis-vertical, iconButton, серый цвет) — 8 строчных и 9 заголовочных правок; в раздел «03 Стиль интерфейса» методологии дописано правило: деструктивные действия — только в кебабе.

Правило интерфейса

  • Кнопка «Удалить» - не висит открытой кнопкой ни в строке таблицы, ни в шапке формы редактирования — спрятана в кебаб-меню «⋮» (группа действий), чтобы пользователь не нажал случайно
  • Безопасные действия остаются видимыми - «Просмотр»/«Изменить», массовые («Удалить выбранные») и быстрые действия не тронуты

Реализация

  • App\Filament\Actions\KebabMenu::make(array $actions) - переиспользуемая обёртка: Filament\Actions\ActionGroup с иконкой heroicon-m-ellipsis-vertical, значок-кнопка (iconButton), серый цвет, тултип «Действия»
  • Таблицы (11 ресурсов) - Warehouse/Pallet/Operation/Version/User/Location/Barcode/Stock/Product/StockMove/SheetConfig: DeleteAction обёрнут в KebabMenu::make([DeleteAction::make()])
  • Формы редактирования (9 Edit-страниц) - EditWarehouse/EditVersion/EditOperation/EditUser/EditLocation/EditBarcode/EditProduct/EditStock/EditStockMove: DeleteAction в getHeaderActions() обёрнут в KebabMenu::make([Actions\DeleteAction::make()])
  • Уведомления (/admin/notifications) - delete переведён в кебаб, toggleRead — компактная иконка-кнопка; убран импорт App\Models\User

Методология

  • 03 Стиль интерфейса §5 - дописано явное правило: деструктивные действия («Удалить») — только в кебаб-меню «⋮», не открытыми кнопками
  • Версия платформы - 1.6.1 → 1.6.2 (config/app.php, config/instances.php, versions.json)

Результат

  • Кнопки «Удалить» в таблицах и формах редактирования спрятаны в кебаб «⋮»: защита от случайного нажатия; строки не перегружены кнопками; тесты KebabMenuTask127Test проверяют структуру рендера (нет открытой ссылки-удаления, есть кебаб-группа с danger-пунктом)
Полная версия →
v1.6.1 minor от 25.09.2026
Задание 124. Уведомления: красный бейдж-счётчик в шапке (как Google) и в боковом меню «Уведомления»
Индикатор непрочитанных уведомлений в админ-панели перекрашен с серо-синего на красный фон с белыми цифрами (как в Google): обновлён бейдж-счётчик у колокольчика в верхнем правом углу (database notifications) и добавлен такой же красный счётчик непрочитанных уведомлений на пункт «Уведомления» в левом боковом меню (/admin/notifications). Счётчик считается по непрочитанным записям таблицы notifications формата filament и обновляется автоматически. Дополнительно таблица «Уведомления» и все стандартные Filament-таблицы переведены на единую палитру платформы: вместо почти чёрного текста ячеек и заголовков (var(--gray-950)/#030712), серых подписей (var(--gray-500)) и почти чёрного фона контейнера в тёмной теме (var(--gray-900)/#111827) используются токены тем (--text-primary/--text-secondary/--text-muted, фон — белый/--bg-surface #1e293b).

Красный бейдж в шапке

  • Колокольчик в верхнем правом углу (database notifications) — счётчик непрочитанных уведомлений на красном фоне (#dc2626) с белыми цифрами, как в Google

Счётчик в боковом меню

  • Пункт «Уведомления» (/admin/notifications) — красный бейдж с числом непрочитанных уведомлений на пункте в левом меню (getNavigationBadge + цвет danger)

Подсчёт

  • Не прочитанные - user->notifications()->where('data->format', 'filament')->whereNull('read_at') — единый подсчёт для шапки и меню
  • Стили - перекрытие цвета бейджей в resources/css/app.css (сборка Vite)

Таблица уведомлений — единая палитра

  • Текст ячеек - заголовки/значения (.fi-ta-text-item) вместо почти чёрного Filament-дефолта (var(--gray-950)) окрашены токеном --text-primary (светлая #0f172a, тёмная #f8fafc; в тёмной теме — var(--bg-surface)), контраст > 6:1
  • Подписи - описания (.fi-ta-text-description) вместо серого var(--gray-500) — токен --text-muted (#475569/#94a3b8)
  • Заголовки колонок - шапка таблицы (.fi-ta-header-cell) — токен --text-secondary (#334155/#cbd5e1)
  • Фон контейнера - .fi-ta-ctn вместо почти чёрного var(--gray-900)/#111827: в светлой теме белый, в тёмной --bg-surface #1e293b

Результат

  • Версия 1.5.0 → 1.6.1: счётчики уведомлений в шапке и в боковом меню стали красными с белыми цифрами; таблица «Уведомления» и стандартные Filament-таблицы приведены к единой палитре платформы (токены обеих тем) вместо почти чёрных Filament-дефолтов
Полная версия →
v1.5.0 minor от 25.09.2026
Задание 123. Спросить у ИИ — настройка показа виджета: шестерёнка, страница настроек, показывать/скрыть
Плавающая кнопка «Спросить у ИИ» (нижний правый угол) получила собственные настройки показа. В шапке виджета возле крестика появилась шестерёнка, которая ведёт на новую страницу «Настройки → Виджет ИИ» (/admin/settings/ai-widget). На странице можно просмотреть все параметры, прописанные в виджете, и одним переключателем включить/выключить показ виджета на платформе (код сохраняется, не удаляется). Выключенный виджет полностью скрыт в админ-панели и на публичной странице «О сервисе» /about. Параметры хранятся в кеше settings.ai_widget (по образцу settings.ai_agents) и используются шаблоном resources/views/partials/ai_agent.blade.php при рендере.

Шестерёнка в шапке виджета

  • Кнопка-шестерёнка возле крестика в шапке виджета «Спросить у ИИ» — переход к настройкам виджета (/admin/settings/ai-widget)

Страница настроек виджета

  • Настройки → Виджет ИИ - просмотр параметров, прописанных в виджете (кнопка, имя в шапке, статус, приветствие, лимит сообщений, форма контактов, поле ввода)
  • Переключатель «Показывать виджет на платформе» — вкл/выкл (не удаление)

Показ и скрытие

  • Включено - виджет виден в админ-панели (renderHook BODY_END) и на публичной странице «О сервисе» (/about)
  • Выключено - виджет полностью скрыт на платформе, код сохраняется

Хранение и API

  • WidgetConfigService - кеш settings.ai_widget (по образцу settings.ai_agents), дефолты = фактические параметры виджета
  • POST /admin/ai-widget/update и POST /admin/ai-widget/reset - включение/выключение и сброс к заводским

Результат

  • Версия 1.4.1 → 1.5.0: показом виджета «Спросить у ИИ» управляет администратор
Полная версия →
v1.4.1 patch от 25.09.2026
Задание 60. Ченджлог от проектов: JSON-эндпоинт /api/v1/changelog для платформ-потребителей
Публичный JSON-эндпоинт changelog для платформ, которые потребляют версии ИИ-агента: GET /api/v1/changelog отдаёт все опубликованные версии (version, title, subtitle, description, result, type, released_at, sections) с индексом платформы (bober-bob, version). Обращение защищено токеном X-API-Key (CHANGELOG_API_TOKEN в .env, config/services.php → changelog.token). Эндпоинт используется платформой Production (Задание 60) — блок «Ченджлог от проекта» и индикатор свежести на карточках проектов из производства.

JSON-эндпоинт

  • GET /api/v1/changelog - опубликованные версии (orderedByVersion, version/title/subtitle/description/result/type/released_at/sections), status, platform, version, count
  • X-API-Key - проверка токена из config services.changelog.token (CHANGELOG_API_TOKEN); пустой токен отключает проверку

Платформа Production (Задание 60, версия 0.26.0)

  • production.ipd.test - синхронизация changelog по кнопке на карточке проекта (/production/production-projects/{id}/changelog-sync), таблица project_changelogs, индикатор свежести в списке проектов из производства

Результат

  • Платформа задач видит, что Бобер Боб сделал - Production получает версии и сделанное (что/когда/результат) из публичного endpoint Бобера
Полная версия →
v1.4.0 minor от 25.09.2026
Задание 122. Changelog и ссылки: публичная история версий
Версионность выведена в отдельную публичную экосистему: история версий открывается клиенту без авторизации по ссылкам /changelog и /changelog/{version}, каждая запись доступна поисковым системам (SEO: title, description, canonical, og:title/og:description/og:url). В админ-панели «Настройки → Версии» у каждой версии появилась видимая ссылка «Ссылка ↗» и кликабельный заголовок, ведущие на публичную страницу версии. В методологию добавлен раздел «05 Версионность и changelog».

Публичные ссылки

  • /changelog и /changelog/{version} - история версий открыта без авторизации, страницы индексируются поисковиками
  • SEO - у каждой страницы title, description, canonical и og-разметка

Ссылки из админ-панели

  • Настройки → Версии - у каждой версии видимая ссылка «Ссылка ↗» и кликабельный заголовок
  • Дашборд - кнопка «Публичная история ↗» на `/changelog`

Методология

  • 05 Версионность и changelog.md - правила версионности (SemVer, sort_key, is_current, is_published) и экосистемы публичных страниц

Результат

  • Версия 1.3.1 → 1.4.0: клиент может открыть историю версий по прямой ссылке
Полная версия →
v1.3.1 minor от 24.09.2026
Задание 121. Дизайн и цвет: нейтральный рабочий стол, крупные часы и дата, правило «цвет по назначению»
Ставка «дизайн под систему, а не система под дизайн». Рабочий стол (дашборд) приведён к правилу «цвет по назначению»: серый/нейтральный базис, цвет только там, где он несёт смысл (светофор: красный/жёлтый/зелёный), синий — единственная кнопка действия «Следующий шаг» и основные ссылки Filament, фиолетовый и пёстрые палитры карточек удалены. Герой больше не кричит «Бобер Боб» большими буквами: на виду крупные живые часы и дата, версия — вторична. Убрана бессмысленная кнопка «Обновить» из шапки дашборда. Правило «цвет по назначению» записано в методологию (02 Правила разработки, 03 Стиль интерфейса, 04 Темы и дизайн).

Дизайн и цвет

  • Герой дашборда - нейтральная карточка вместо синего градиента; крупные живые часы (data-live-clock) и дата, «Бобер Боб · Платформа складского учёта» скромно сверху, версия вторична справа
  • Правило «цвет по назначению» - серый/нейтральный базис, цвет только по смыслу: светофор красный/жёлтый/зелёный, синий — единственная кнопка действия, фиолетовый удалён
  • KPI-карточки нейтральны - все 6 KPI и быстрые действия переведены на серые чипы и нейтральные hover-рамки (были blue/emerald/violet/indigo/cyan/sky/teal)
  • Движения товара - светлофорная семантика: приход зелёный, уход красный, перемещение серый (были emerald/rose/sky)
  • FEFO - замена оранжевого на жёлтый (семантика «требует внимания»)
  • Кнопка «Обновить» удалена из шапки дашборда (не несла смысла)

Методология

  • 02 Правила разработки.md - правило «цвет по назначению»
  • 03 Стиль интерфейса.md - раскраска интерфейса в правило, нейтральный герой
  • 04 Темы и дизайн.md - палитра «по назначению»: семантика светофора, серый базис, синий для одной кнопки, запрет фиолетового

Версия

  • config/app.php - 1.2.6 → 1.3.1
  • config/instances.php - agent version 1.2.6 → 1.3.1
  • resources/json/versions.json - добавлена запись 1.3.1 (строка 1)

Тесты

  • Фиксаторы версии - LogisticsPlatformTask114Test, RemoveChatsTask107Test, RemoveGoogleTask108Test, RemoveGrayColorTask109Test: 1.2.6 → 1.3.1
Полная версия →
v1.2.6 patch от 24.09.2026
Задание 119. Темы темная и светлая: методология дизайна и новый файл дизайн-гайда
Платформа пройдена «глазами» обеих тем (тёмная и светлая), оформление финализировано и задокументировано. Методология разработки перестроена по образцу Marketing (папка «разработка платформы»): созданы файлы «01 Среда и команды», «02 Правила разработки», «03 Стиль интерфейса» и новый «04 Темы и дизайн» — style-guide платформы (палитра обеих тем, токены html.dark и :root, правило специфичности html.dark > :root, компоненты: Repeatable-таблица «Движение товара», кебаб-меню, светофор, мобильная версия, чек-лист проверки дизайна). README стал хабом с описанием всей экосистемы разработки в одном месте: дизайн (как выглядит), вёрстка (видимая часть), программирование (невидимая часть), мобильная версия. Описания правил улучшены, добавлены перекрёстные ссылки. Дизайн-система: холодный slate + Google Material Blue, контраст >6:1, шрифт ≥14px.

Методология

  • 04 Темы и дизайн.md - новый файл style-guide платформы: токены тёмной (html.dark) и светлой (:root) тем с контрастами, почему html.dark побеждает :root, перекрытия Filament, правильное применение токенов в blade, Repeatable-таблица, светофор, мобильная версия, проверка перед сдачей
  • 01 Среда и команды.md - среда (C:\Herd\bober-bob.ipd, БД bober_bob_test, сайт ipd.test/admin), команды тестов, tinker через stdin-pipe, рендер-проверки, сборка CSS, состав команды
  • 02 Правила разработки.md - железные правила: запреты (деплой/миграции/версии/дамбы через PowerShell >), контраст и шрифты, токены тем, стиль кода, версионирование SemVer, проверка перед сдачей, git
  • 03 Стиль интерфейса.md - компоновка экранов: страница = один шаг пути, одна синяя кнопка, светофор, дашборд (герой/КПИ/светофор/навигация), кебаб-меню, breadcrumbs, SVG-инфографика, правила ссылок

README хаб

  • Экосистема разработки в одном README - дизайн (как выглядит), вёрстка (видимая часть), программирование (невидимая часть), мобильная версия; общее правило: дизайн не подменяется программированием и наоборот
  • Версия методологии 1.0.0 → 1.1.0, журнал пополнен записью 1.2.6

Версия

  • config/app.php - 1.2.5 → 1.2.6
  • config/instances.php - agent version 1.2.5 → 1.2.6
  • resources/json/versions.json - добавлена запись 1.2.6

Тесты

  • Фиксаторы версии - LogisticsPlatformTask114Test, RemoveChatsTask107Test, RemoveGoogleTask108Test, RemoveGrayColorTask109Test: метод/значение 1.2.5 → 1.2.6
  • Эталон - 103 passed, 4 известных pre-existing падения не связаны
Полная версия →
v1.2.5 patch от 23.09.2026
Задание 117. Реальные данные клиента загружены: страница товара показывает источник и движение
На платформу загружены реальные данные клиента из первоисточника «2026-07-15 Продажи и остатки 1 фура.xlsx» (листы «До 01.06», «После 01.06» и «ББ_склад»): 55 товаров, 19 паллет, 35 строк остатков и 222 движения (62 прихода по двум поставкам, 160 расходов по покупателям — «кто заказал»). На странице товара (клик по товару, например /admin/products/48) теперь видно, откуда взяты данные (файл-первоисточник, лист, строка) и движение товара: поставки и заказы с датами, покупателями и суммами. Цены на страницах товаров и движений переведены из BYN в рублёвые ₽ (в файле клиента цены в рублях). Импорт идемпотентен: повторный запуск не дублирует данные.

Импорт из первоисточника клиента

  • app/Services/ImportSkladService.php - новый сервис импорта xlsx (листы продаж и складского остатка) с нормализацией ключей товаров: «Жареные бобы соль (1 кг)» ↔ «бобы соль 1», сопоставлением с каталогом, созданием новых товаров только при реальном несовпадении
  • app/Console/Commands/ImportSkladCommand.php - artisan bober:import-sklad {--file=}: идемпотентный (движения с меткой file:2026-07-15 пересоздаются, товары обновляются, а не дублируются), с отчётом в консоли
  • Лист «27-07-2026 Move» - демо-данные бота не загружаются; мусорная AI-строка с количеством 12 345 678 и служебные строки-итоги пропускаются
  • Паллеты и остатки - 19 уникальных паллет («9 нов», «18 стар» и т.п., статус по тексту), остатки агрегируются по товару (например, «Бобы соль 1» = 251 упаковка из нескольких паллет)
  • Движения - 222: поставки периода 1 и 2 (60 и 150+ упаковок с ценами из файла) и расходы по покупателям (Меликишвили, Лебедев, Афина, Гуднат, ИП Меликишвили и др.) с датами 01.06.2026 и 15.07.2026

Страница товара

  • Источник данных - infolist-секция на странице товара (/admin/products/{id}): Файл-источник, Лист в файле, Строка в файле + примечание (данные из актуального файла клиента, цены в ₽)
  • Движение товара - RepeatableEntry-таблица: Дата, Событие (Поставка / Заказ), Покупатель/документ, Кол-во шт, Сумма ₽; до 200 последних движений
  • Валюта BYN→RUB - цены на страницах товаров (ProductResource, клиентский ProductResource), движений (MovementResource) и валюта по умолчанию в настройках переведены в рублёвые ₽

Версия

  • config/app.php - 1.2.4 → 1.2.5
  • config/instances.php - agent version 1.2.4 → 1.2.5
  • resources/json/versions.json - добавлена запись 1.2.5

Тесты

  • tests/Feature/ImportSkladTask117Test.php - 5 тестов: нормализация ключей, привязка строк продаж к каталогу, создание нового товара с ценой из файла, идемпотентность повторного импорта, страница товара (источник + движение)
Полная версия →
v1.2.4 patch от 23.09.2026
Задание 116. Рабочий стол: живые часы и «движение» платформы
Рабочий стол стал «живым»: в нижнем левом углу боковой панели добавлены часы (часы:минуты:секунды) рядом с версией платформы — как на платформе маркетинга (marketing.ipd.test) — блок кликабельный и ведёт на страницу версий. В hero рабочего стола добавлены живые часы с секундами и датой (обновляются раз в секунду), а строка «Версия» стала кликабельной ссылкой на версии. Рабочий стол показывает, что происходит на платформе: последние движения, светофор системы, FEFO, экономия времени и сводка по остаткам.

Нижний левый угол боковой панели

  • Часы + версия - в SIDEBAR_FOOTER добавлены живые часы ЧЧ:ММ:СС (data-live-clock, JS раз в секунду) и версия v{{ config('app.version') }}
  • Клик → версии - весь блок является ссылкой на /admin/settings/versions (образец - marketing.ipd.test: версия кликабельна и ведёт на /about)

Рабочий стол

  • Живые часы - в hero добавлены часы с секундами и дата (now()->translatedFormat('l, d F')), обновляются каждую секунду
  • Версия кликабельна - строка «Версия» на рабочем столе ведёт на /admin/settings/versions
  • Движение - стол показывает происходящее: последние движения (приход/списание/перемещение), светофор системы, FEFO-предупреждения, топ товаров, экономия времени, сводка по остаткам

Версия

  • config/app.php - 1.2.3 → 1.2.4
  • config/instances.php - agent version 1.2.3 → 1.2.4
  • resources/json/versions.json - добавлена запись 1.2.4
  • CSS - пересобран при необходимости новых классов (text-[15px], tabular-nums)
Полная версия →
v1.2.3 patch от 23.09.2026
Задание 115. Методология разработки платформы применена — контраст и шрифт ≥14px
Создана и применена методология разработки платформы Бобер Боб (копия методологии Production, адаптированная под складскую платформу; путь: «Разработчик 2/Бобер Боб/Методология разработки платформы»). Аудит интерфейса по 12 правилам: исправлена нечитаемость страницы «Версии» в светлой теме (были хардкод-стили только тёмной темы — белый текст #f8fafc на белом фоне; теперь тема-зависимые CSS-переменные --text-primary/--text-secondary/--text-muted для обеих тем), поднят контраст вторичного текста на всех страницах (text-gray-400 → text-gray-600, #64748b → #94a3b8/#475569 во всех темах, минимум 6:1), запрещены шрифты меньше 14px (text-xs → text-sm по всей платформе, text-[8px]/text-[10px] убраны из сборки CSS, из tailwind-сканирования исключены тесты). Пересобран CSS-бандл. Контраст и типографика соответствуют правилам 8 методологии. Платформа переведена на версию 1.2.3.

Методология

  • README методологии - создан и адаптирован под склад: «Бобер Боб/Методология разработки платформы/README.md» (v1.0.0), 12 правил, правило 8 ужесточено - обе темы обязательны
  • Аудит интерфейса - все страницы панели проверены на контраст и размер шрифта по правилам 8

Контраст ≥ 6:1

  • settings/versions - убраны хардкод-стили тёмной темы: белый текст на белом фоне заменён на переменные --text-primary/--text-secondary/--text-muted, карточки через --ver-card-bg/--ver-card-border (свои значения для светлой и тёмной темы)
  • custom-dashboard - text-gray-400/#64748b (≈4.6:1) подняты до text-gray-600/#94a3b8 (≥6:1)
  • login-custom - #64748b на #0f172a (≈4.6:1) → #94a3b8 (≥7:1)
  • telegram-share / shared-conversation - #64748b на белом (≈4.6:1) → #475569 (≈7:1)

Шрифт ≥ 14px

  • text-xs (12px) - удалены со всех страниц, заменены на text-sm (14px)
  • text-[8px]/text-[10px] - исключены: tests/** добавлено в @source not, пересобран CSS, в бандле 0 совпадений font-size < 14px

Версия

  • config/app.php - 1.2.2 → 1.2.3
  • config/instances.php - default agent version 1.2.2 → 1.2.3
  • resources/json/versions.json - добавлена запись 1.2.3
  • public/build/assets/app.css - пересобран
Полная версия →
v1.2.2 patch от 23.09.2026
Задание 115. Дизайн интерфейса — платформа переведена в единую экосистему (дизайн-система my.ipd)
Цветовое оформление платформы приведено к единой дизайн-системе экосистемы (эталон — https://my.ipd.test «Экосистема забот», design-система v0.19.0): убрана тёплая «коричневая» палитра (Total Commander) и золотой корпоративный акцент. Теперь используются токены my.ipd: холодный slate (тёмная #0f172a/#1e293b/#334155, светлая #f1f5f9/#ffffff/#e2e8f0), текст #f8fafc/#cbd5e1/#94a3b8 и #0f172a/#334155/#475569, акцент Google Material Blue #3b82f6 (hover #2563eb, в светлой — #2563eb). Подключён шрифт Inter (400–800) — тот же, что на my.ipd — во все панели (Filament ->font('Inter') + Google Fonts в head, theme-color #0f172a). Заменены все вьюшки с жёсткими hex тёплой палитры на slate-токены; золото #c9a96e/#a0845e в about/login/versions заменено на синий акцент. Дефолты настроек внешнего вида: primary #2563eb, accent #3b82f6, фон «тёмный». Платформа переведена на версию 1.2.2.

Палитра = дизайн-система my.ipd

  • Тёмная тема — фон #0f172a (slate-900), поверхности #1e293b (slate-800), elevated/borders #334155 (slate-700), текст #f8fafc/#cbd5e1/#94a3b8
  • Светлая тема — фон #f1f5f9, карточки #ffffff, границы #e2e8f0, текст #0f172a/#334155/#475569
  • Акцент — Google Material Blue #3b82f6 (hover #2563eb); в светлой теме #2563eb (hover #1d4ed8)

Шрифт Inter

  • Filament — ->font('Inter') в AdminPanelProvider и ClientPanelProvider
  • Google Fonts — preconnect + Inter 400–800 в partials/favicon-head (все панели и публичные страницы)
  • Базовая типографика — font-family 'Inter', system-ui в app.css

Замена тёплой палитры во вьюшках

  • resources/css/app.css — токены переписаны с тёплого чёрного (161613…) на slate-токены my.ipd
  • ~19 blade-вьюшек — жёсткие hex-значения тёплой палитры заменены на slate-токены (ai-agents, webchat, kebab-menu, user-menu-caption, custom-dashboard и др.)
  • Золото → синее — #c9a96e/#a0845e в about, login-custom, settings/versions заменены на #3b82f6/#2563eb
  • about/login/versions — полный свип — убраны тёмно-синие/тёплые фоны (navy-градиенты #1a237e/#0a0e27/#0d1442 и золотые hover #dabf8c) → холодный slate + синий герой-градиент как на my.ipd (linear-gradient(135deg,#3b82f6,#2563eb))
  • custom-dashboard — тёплые серые (#a0a09a/#606058/#808078/#252522/#1a1a18) заменены на slate (#94a3b8/#64748b/#334155/#263447); янтарные/оранжевые декоративные акценты карточек заменены на холодные (indigo/violet); статусные цвета светофора (зелёный/жёлтый/красный) сохранены как семантические

Версия

  • config/app.php — 1.2.1 → 1.2.2
  • config/instances.php — default agent version 1.2.1 → 1.2.2
  • resources/json/versions.json — добавлена запись 1.2.2
Полная версия →
v1.2.1 patch от 18.09.2026
Задание 114. Платформа = связь данных: меню-логистика, экономия времени, ИИ вынесен
Платформа переосмыслена как обработчик складских данных (импорт/экспорт 1С в следующем этапе), а не как чат: ИИ-чат убран с рабочего стола (агент управляется через Telegram), не-логистические разделы скрыты из меню (Telegram-боты, карточки клиентов, отчёты, Google-таблицы, n8n, журнал синхронизации, системный монитор, старые движения, webchat-сессии — доступ сохранён по URL). Левое меню пересобрано в две группы: «Склад» и «Администрирование». На рабочем столе добавлен блок «Экономия времени»: число операций (operations + legacy movements) умножается на норматив ручной обработки (приход 15 мин, отгрузка 10 мин, перемещение 5 мин, инвентаризация 30 мин, заказ 4 мин) и показывается как сэкономленные часы за сегодня/неделю/месяц. Карточка KPI «Telegram» заменена на «Штрихкоды» (barcode-first учёт). Зелёный веб-виджет в правом нижнем углу сохранён. Платформа переведена на версию 1.2.1.

Меню = логистика

  • Группы — остались только «Склад» и «Администрирование»; «Чаты», «Отчёты», «Основное», «Интеграции» исчезли как пустые
  • Скрыты из меню (работают по URL): TelegramBots, ClientCards, AuditSummary, SystemMonitor, SyncLogs, N8nWebhookSettings, SheetConfig, WebchatSession, TelegramUser, MovementResource (устаревшая таблица движений)
  • ProductResource — перенесён из «Основное» в «Склад» (сортировка 1)

ИИ вынесен с платформы

  • AI-чат удалён с рабочего стола — блок с fetch(/admin/sheets/agent) заменён блоком «Экономия времени»
  • Ссылки навигации — убраны AI Агенты, AI Чат, Виджет, Telegram
  • Зелёный виджет (partials.ai_agent, BODY_END) — сохранён по указанию; управление агентами переходит в Telegram

Экономия времени

  • config/logistics.php — нормативы ручной обработки: receive 15, ship 10, move 5, inventory 30, order 4 мин + legacy_movement_map (in→receive, out→ship, transfer→move)
  • TimeSavingsService — расчёт за период; приоритет operations (новые документы), фолбэк на movements до их появления
  • Рабочий стол — блок «Экономия времени»: часы за месяц, периоды сегодня/неделя/месяц, разбивка по типам; в сводке «Сэкономлено за месяц»

Версия

  • config/app.php — 1.2.0 → 1.2.1
  • config/instances.php — default agent version 1.2.0 → 1.2.1
  • resources/json/versions.json — добавлена запись 1.2.1
Полная версия →
v1.2.0 minor от 18.09.2026
Задание 113. Целевая архитектура: locations, operations, stock_moves, barcodes
Модель данных платформы расширена до целевых сущностей под задание 113 к логистике в рамках Задания 113: добавлены локации (locations), операции (operations) с позициями (operation_items) и журналом движения остатков (stock_moves — было→стало, delta, from/to location), а также штрихкоды (barcodes) для товаров. Паллеты и склады привязаны к локациям (pallets.location_id). В админ-панель добавлены Filament-ресурсы Location, Operation, StockMove и Barcode. Остаток теперь может вычисляться как результат операций, движение фиксируется с точностью до локации. Платформа переведена на версию 1.2.0.

Миграции

  • locations — code, kind, note (склады/паллетные зоны как локации)
  • operations + operation_items — документы и строки операций
  • stock_moves — журнал: product_id, delta, было/стало, from/to location
  • barcodes — code, product_id, unit
  • pallets.location_id + stocks.location_id — привязка к локации

Модели

  • Location, Operation, OperationItem, StockMove, Barcode — новые модели со связями
  • Product/Pallet/Stock — дополнены связями (barcodes, stockMoves, operationItems, location)

Админка

  • LocationResource — список/создание/редактирование локаций
  • OperationResource / StockMoveResource / BarcodeResource — новые разделы в панели

Версия

  • config/app.php — 1.1.0 → 1.2.0
  • config/instances.php — default agent version 1.1.0 → 1.2.0
Полная версия →
v1.1.0 minor от 14.09.2026
FEFO-учёт по паллетам: приход/списание с приоритетом «стар» → «нов»
Паллеты теперь полноценно участвуют в операциях прихода и списания. Списание (take) распределяется по паллетам в порядке FEFO: сначала списывается с паллет со статусом «стар», затем «нов», затем без статуса. При подтверждении пользователь видит план распределения по паллетам. Приход (add) автоматически попадает на ту паллету, где уже есть остатки товара; если такой нет — создаётся новая паллета со статусом «нов» и автонумерацией. Поле «Статус поставки» (нов/стар) добавлено в админку PalletResource. Движения (Movement) привязаны к конкретной паллете, отмена (cancel) корректно работает с паллетным остатком. Тесты: FEFO-приоритет, приход на существующую паллету, приход с созданием новой паллеты.

FEFO-списание по паллетам

  • buildTakePlan — FEFO-распределение: стар(0) → нов(1) → без статуса(2), с сортировкой по ID
  • applyTakePlan — транзакционное списание по паллетам с Movement per pallet, проверка достаточности
  • Pending-сообщение — показывает план по паллетам: «22 стар: 1 короб.(24 шт), 9 нов: 1 короб.(24 шт)»

Приход на паллету

  • resolveAddPallet — находит существующую паллету товара; если нет — создаёт новую с номером «N нов»
  • nextPalletNumber — автонумерация паллет (максимальный числовой префикс + 1)
  • applyAdd — firstOrCreate Stock на целевой паллете + Movement с pallet_id

Админка

  • PalletResource — Select «Статус поставки» (нов/стар) + колонка badge в таблице
  • Pallet model — status в fillable, accessor status_label

Миграция

  • pallets.status — nullable string, indexed (нов/стар/null)

Версия

  • config/app.php — 1.0.3 → 1.1.0
  • config/instances.php — default agent version 1.0.3 → 1.1.0
Полная версия →
v1.0.3 patch от 14.09.2026
Задание 111. Telegram-бот работает без ошибок и берёт данные с платформы
Исправление Telegram-бота @BBmsk_admin_bot под задание 111: бот без ошибок отвечает клиентам и берёт актуальные данные напрямую с платформы (база данных: товары и остатки), а не из внешних сервисов. Убрана китайская битая строка в приветствии и справке бота («Привет! Я бот Бобер Боб帮你管理库存ом» → корректный русский текст), исправлен битый placeholder «Например: поставщик,联系人...» в карточке Telegram-пользователя, smoke-тест бота переведён на публичный webhook /webhook/telegram/public. LLM-агент синхронизирован с конфигом: api=openrouter, model=openai/gpt-4o-mini. Платформа переведена на версию 1.0.3.

Telegram-бот без ошибок

  • Приветствие/справка - убрана битая китайская строка «帮你管理库存», текст заменён на «Привет! Я бот Бобер Боб, помощник по учёту склада»
  • AiAgentService - исправлены ответы unknown и help (строки 106 и 523)
  • TelegramUserResource - placeholder «Например: поставщик,联系人...» заменён на «Например: поставщик, кладовщик, админ...»

Данные берутся с платформы

  • Агент default - api=openrouter, model=openai/gpt-4o-mini (конфиг синхронизирован с .env AI_API/AI_MODEL)
  • processWithLLM - ответ про реальные остатки из таблиц Stock/Product платформы (проверено: «Сколько осталось барбекю?» → корректные остатки)

Тесты

  • BrestBotSmokeTest - webhook переведён на публичный маршрут /webhook/telegram/public (ранее падал 302 из-за auth-группы)
  • Результат - тест бота проходит: валидная модель OpenRouter, ответ без «Ошибка подключения LLM»

Версия

  • config/app.php — версия 1.0.2 → 1.0.3 (env('APP_VERSION', '1.0.3'))
  • config/instances.php — версия агента default 1.0.2 → 1.0.3
  • resources/json/versions.json — добавлена запись 1.0.3
  • Проверка — на bober-bob.ipd.test версия платформы теперь 1.0.3
Полная версия →
v1.0.2 patch от 03.09.2026
Задание 109. Цвет — обновлена цветовая схема платформы (Material Design)
Обновление цветовой схемы админ-панели под задание 109: тёмная тема переведена с холодного серого zinc на тёплый нейтральный чёрный (стиль Terminal/Total Commander) с тёплыми светлыми оттенками текста и контрастом выше 6:1 (до ~11–17:1). Светлая тема приведена к единому профилю Google Material Design с тёмно-серыми буквами и контрастом выше 6:1. Первичный цвет primary изменён с серого (Color::Gray) на стандартный акцент Material Design Material Blue 600 (Color::Blue). Использованы стандартные цвета Google Material, рекомендованные при разработке. Платформа переведена на версию 1.0.2.

Тёмная тема — тёплый нейтральный чёрный (как Total Commander)

  • BG base - тёплый чёрный #161613 вместо холодного zinc-950 #09090b
  • BG surface/elevated - тёплые поверхности #1f1f1c / #2a2a26
  • Текст - тёплый белый #f5f5ef (≈17:1) и тёплые серые #d3d3cc (≈11:1), #b8b8b0 (≈9:1) вместо холодного #a1a1aa
  • Акцент - Material Blue 600 #1e88e5 (hover #1976d2)

Светлая тема — единый профиль Material Design

  • Текст - тёмно-серый #161616 (≈18:1), #3d3d3d (≈12:1), #5a5a5a (≈7:1) - контраст > 6:1 на белом
  • Фон - #f5f5f2, границы #d4d4cf
  • Акцент - Material Blue 600

Primary акцент

  • AdminPanelProvider - primary изменён с Color::Gray на Color::Blue
  • Кнопки, ссылки и активные элементы теперь используют стандартный Material Blue
Полная версия →
v1.0.1 patch от 03.09.2026
Задание 108. Глобальное изменение - убираем Google и чаты (часть 2)
Вторая итерация глобальной перестройки платформы под задание 108: Telegram-бот полностью переведён на прямую работу с базой данных платформы (запись прихода/расхода, движения, остатки) без обращения к Google Таблицам. Все вызовы экспорта/импорта/синхронизации с Google удалены из пути работы агента и Telegram-бота: из AiAgentService убраны syncStockToSheet и logMovementToSheet, кнопка «Синхронизировать» (импорт из Google) убрана из списка товаров. Данные хранятся в базе платформы (Stock, Movement), часть данных не удалялась. Платформа переведена на версию 1.0.1.

Telegram-бот работает с базой напрямую

  • Схема «Telegram-бот → БД» — приход/расход/отмена пишутся сразу в таблицы Stock и Movement платформы; лишние вызовы в Google убраны
  • AiAgentService — удалены блоки syncStockToSheet и logMovementToSheet из executeOperation и handleCancel; удалён конструктор GoogleSheetService и setSheetService
  • ConfiguresSheetServices — больше не настраивает Google-сервис для агента, только источник (source)

Google: убраны обращения

  • Импорт из Google — кнопка «Синхронизировать» в списке товаров (ProductSyncService) удалена
  • Экспорт/синхронизация — вызовы записи в Google Таблицы (updateCell, appendRow, ensureSheet) больше не вызываются из пути работы агента и Telegram-бота
  • Данные не удалены — конфигурация Google Таблиц и накопленные данные (last_sync_data) сохранены в базе

Версия

  • config/app.php — версия 1.0.0 → 1.0.1 (env('APP_VERSION', '1.0.1'))
  • resources/json/versions.json — добавлена запись 1.0.1
  • Проверка — на bober-bob.ipd.test версия платформы теперь 1.0.1
Полная версия →
v1.0.0 major от 03.09.2026
Задание 107. Глобальное изменение - убираем Google и чаты
Первая итерация глобальной перестройки платформы под задание 107: левое меню освобождено от лишних точек коммуникации (тестовый/стейдж/прод чаты, Webchat-сессии, AI-чаты, AI-агенты), оставлена единственная точка общения с клиентами - Telegram-бот. Google-дашборд скрыт из навигации, пути страниц сохранены для обратной совместимости. Платформа переведена на версию 1.0.0.

Навигация

  • Левое меню - убраны Тестовый/Стейдж/Прод чаты, Webchat-сессии, AI-чаты, AI-агенты; оставлен только Telegram-бот
  • Скрытие без удаления - страницы и маршруты сохранены, из меню скрыты через shouldRegisterNavigation=false

Google-слой

  • Google-дашборд - скрыт из меню, первым шагом уходит зависимость от Google Таблиц как видимой точки
Полная версия →
v0.31.1 patch от 02.09.2026
Светофор системы: расширение до 11 блоков
Система светофора рабочего стола расширена с 6 до 11 блоков: добавлены Товары, Остатки, Склады, Версии/релизы и AI-агенты. Сводный индикатор теперь охватывает весь жизненный цикл платформы — от каталога товаров и движения остатков по складам до выпуска новых версий и подключения ИИ-агентов к нейросети.

Новые блоки светофора

  • Товары — зелёный при недавнем обновлении каталога, красный при давнем изменении, серый если каталог пуст; показывает число активных товаров
  • Остатки — статус по последнему движению средств/товара, показывает суммарное количество единиц в стоках
  • Склады — количество активных складов, серый при отсутствии активного склада
  • Версии / релизы — статус по дате последнего релиза из журнала версий, показывает число релизов
  • AI-агенты — зелёный если хотя бы один агент подключён к LLM, жёлтый при работе только на regex; отдельно показывает число агентов с нейросетью

Изменения в UI

  • Расширенный блок «Что требует внимания» — новые красные/жёлтые блоки попадают в список проактивных уведомлений с человеческим объяснением и ссылкой
  • Сетка карточек — увеличена с 6 до 4 колонок (xl:grid-cols-4) для размещения 11 блоков
  • Иконки — у всех карточек заданы корректные иконки heroicons (cube, archive-box, building-office-2, code-bracket, user-group)

Backend bober-bob

  • app/Services/TrafficLightService.php — добавлены методы productsStatus/stocksStatus/warehousesStatus/versionsStatus/aiAgentsStatus
  • resources/views/filament/pages/custom-dashboard.blade.php — рендер новых блоков и поле «с LLM» у AI-агентов
  • resources/json/versions.json — добавлена запись 0.31.1
Полная версия →
v0.31.0 minor от 28.08.2026
Рабочий стол 2.0: система светофора и проактивные уведомления
Рабочий стол стал центром навигации: сверху — «Светофор системы» с цветными индикаторами (зелёный/жёлтый/красный/серый) по всем ключевым блокам платформы (Пользователи, Движения, Google Таблица, AI-чаты, ИИ-агент виджет, Telegram-бот), клик по карточке ведёт в соответствующий раздел. Подсветка сотрудникам: есть ли заходы, когда было движение средств, когда обновлялась таблица, кто и когда писал ИИ-агенту.

Светофор рабочего стола

  • 6 карточек-светофоров — Пользователи, Движения, Google Таблица, AI-чаты, ИИ-агент (виджет), Telegram-бот — каждая с цветным индикатором, датой последней активности и ссылкой-переходом в раздел
  • Зелёный — активность до 3 дней, жёлтый — 4–7 дней, красный — более 7 дней или ошибка/нет настроек, серый — блок не используется
  • Общий статус — сводная лампа сверху: красный если любой блок красный, иначе жёлтый при жёлтых, иначе зелёный

Проактивные уведомления

  • Что требует внимания — список красных/жёлтых блоков с человеческим объяснением проблемы и ссылкой для перехода («Никто не заходил на платформу», «Google Таблица не обновлялась», «Не было движения средств»)
  • Счётчик — количество требующих внимания пунктов в шапке светофора

Трекинг входов

  • users.last_login_at/last_login_ip — теперь записываются при каждом логине (слушатель события Login в AppServiceProvider, работает и для Filament, и для switchUser)
  • Светофор «Пользователи» — показывает красный, если никто не заходил, и дату последнего входа

Backend bober-bob

  • app/Services/TrafficLightService.php — новый сервис: статусы всех блоков, пороги 3/7 дней, список «пристального внимания»
  • DashboardOverview — методы getTrafficStatuses/getTrafficAttention/getTrafficOverall
  • custom-dashboard.blade.php — блок светофора в начале рабочего стола
  • config/app.php — версия 0.30.1 → 0.31.0
Полная версия →
v0.30.1 patch от 27.08.2026
Доступность: минимальный шрифт 14px и контраст 6.55:1 по всей платформе
Весь интерфейс платформы приведён к единому стандарту доступности: минимальный размер шрифта 14px, контраст текста 6.55:1 (выше требования WCAG AA 4.5:1). Исправлено 47 жёстко заданных font-size меньше 14px, 100+ Tailwind-классов text-xs (12px) заменены на text-sm (14px), приглушённый цвет #71717a (4.5:1) заменён на #a1a1aa (6.55:1) в 60 местах.

Минимальный шрифт 14px

  • 47 font-size < 14px — исправлены в about, ai_agent, webchat-conversation, webchat-session-view, login-custom, versions, telegram-chat, telegram-chat-list, telegram-share, shared-conversation
  • 100+ text-xs (12px) — заменены на text-sm (14px) в 16 blade-файлах (dashboard, ai-chat, ai-agents, client-cards, audit-summary, system-monitor, n8n-webhook-settings, google-sheets-dashboard и др.)
  • Настройка типографики — опция «12px — Маленький» удалена из админ-панели (SettingsTypography), минимум теперь 14px

Контраст 6.55:1

  • #71717a (4.5:1) — заменён на #a1a1aa (6.55:1) в 60 местах: палитра CSS (--text-muted), webchat, ai-chat, ai-agents, dashboard, таблицы
  • Тёмная тема — все приглушённые тексты теперь читаемы на фоне #09090b
  • files — resources/css/app.css, все blade-шаблоны ресурсов и страниц Filament

Backend bober-bob

  • config/app.php — версия 0.30.0 → 0.30.1
  • Безопасность — /telegram-chat и /telegram-chat/{id} переведены за middleware auth (ранее публично доступна вся история чатов)
  • Проверка — /about и /admin/settings/versions показывают v0.30.1 с бейджем «Текущая»
Полная версия →
v0.30.0 minor от 26.08.2026
Полноценный AI-агент: веб-чат, Telegram-бот через LLM, аналитика сессий
AI-агент полностью подключён к LLM (OpenRouter, gpt-4o-mini): веб-виджет на публичных страницах, Telegram-бот @BBmsk_admin_bot отвечает через ИИ вместо regex-меню, в админке — просмотр всех сессий с перепиской, латентностью ответов и захватом лидов. База знаний 45 товаров, системный промпт, webhook-маршруты для n8n.

Веб-чат AI

  • ai_agent.blade.php — виджет веб-чата: плавающая кнопка, панель с историей, подсказками, захватом лидов и rate-limit
  • WebchatController — 5 API-методов: send, history, track, suggestions, lead
  • WebchatService — бэкенд агента: обработка через LLM, сохранение в AiConversation, уведомление администратора в Telegram

Telegram-бот через LLM

  • SheetController::telegramWebhook — вызов processWithAgent вместо regex-меню; фолбэк на env('AI_OPENAI_KEY') при пустом кеше
  • Webhook — https://bober-bob.ipd.by/webhook/telegram/public (public route, CSRF exempt)
  • Просмотр переписок — /telegram-chat (список) и /telegram-chat/{id} (диалог), тёмная Telegram-тема

Админ-панель

  • WebchatSessionResource — список и просмотр сессий, HTML-компонент с перепиской, латентность ответов в мс
  • Панель — maxContentWidth(Width::Full) убран 160px margin по краям
  • Виджет на дашборде — статистика сессий и лидов

Инфраструктура

  • AiAgentService — processWithAgent (LLM через OpenRouter) и processCommand (regex, в резерве)
  • AgentConfigService — конфиг агентов с кешем и подстановкой ключа из env
  • config/instances.php — дефолты: api=openrouter, model=openai/gpt-4o-mini
  • KB — public/ai-kb/bober-bob/persona.md и system.md, 45 реальных товаров
Полная версия →
v0.29.2 minor от 23.08.2026
Профессиональная страница версий: единый источник данных, 50 записей, детализация по секциям
Страница версий (/admin/settings/versions) переведена на единый источник данных resources/json/versions.json — ту же базу, что и страница /about. Отображаются 50 последних версий с полной детализацией: заголовок, описание, секции с техническими деталями и результатами. Каждая версия — карточка с бейджем типа (major/minor/patch), датой и пометкой «Текущая» для активной.

Единый источник версий

  • SettingsVersions.php — чтение из resources/json/versions.json вместо таблицы versions в БД; страница /about и /admin/settings/versions теперь используют один источник
  • resources/json/versions.json — единый ресурс: 47 записей (v0.1.0–v0.29.2), каждая с version, date, title, description, sections[{title, items}]
  • Результат — больше нет дублирования данных между страницами; обновление одной обновляет обе

Детализация по секциям

  • Каждая версия — заголовок, описание, секции с техническими деталями (какие файлы изменены, что сделано, какой результат)
  • Секции — группы изменений: например, «Фавикон и иконки», «PWA (установка как приложение)», «Backend bober-bob»
  • Формат — Markdown-жирный (**) для имён файлов и ключевых слов, человекочитаемые описания для каждого пункта

Отображение 50 записей

  • Лимит 50 — показываются 50 последних версий без пагинации; достаточно для полной картины истории платформы
  • Сортировка — от новой к старой (как в versions.json); текущая версия помечена бейджем «Текущая»
  • Карточки — каждая версия в отдельном блоке с hover-эффектом и цветовой маркировкой по типу

Backend bober-bob

  • config/app.php — версия 0.29.1 → 0.29.2 (env('APP_VERSION', '0.29.2'))
  • resources/json/versions.json — добавлена запись 0.29.2
  • Проверка — /admin/settings/versions показывает 50 версий с полной детализацией
Полная версия →
v0.27.3 patch от 11.08.2026
Фавикон и PWA: иконка сайта в браузере и установка как приложение
Платформа получила современный фавикон и иконки PWA: теперь сайт узнаваем в браузере (вкладка, закладки) и красиво устанавливается как приложение на Android с подписью «Бобер Боб». Иконка выполнена в фирменном стиле: тёмно-синий градиент и золотое «созвездие» с логотипа.

Фавикон и иконки

  • public/favicon.svg — основной фавикон (SVG, современный формат, масштабируется без потерь)
  • public/favicon.ico — многоразмерный ICO (16/32/48) для старых браузеров и системных значков
  • public/favicon-16x16.png / favicon-32x32.png / favicon-48x48.png — растровые PNG
  • public/apple-touch-icon.png (180×180) — иконка для iOS (домашний экран iPhone/iPad)
  • public/favicon-192x192.png / favicon-512x512.png — иконки Android/Chrome для установки приложения
  • public/favicon-maskable-192/512.png — maskable-иконки (контент в безопасной зоне 80%, обрезаются овалом адаптивно)

PWA (установка как приложение)

  • public/manifest.webmanifest — манифест: name «Бобер Боб — платформа», short_name «Бобер Боб», display standalone, start_url /admin, цвета темы #0d1442 и фона #0a0e27
  • public/sw.js — service worker: кеширует иконки/манифест, для навигации network-first с fallback на /admin
  • Результат — на Android через меню «Установить приложение» платформа ставится на домашний экран с иконкой и подписью

Подключение в шаблонах

  • resources/views/partials/favicon-head.blade.php — общий блок мета-тегов (favicon, apple-touch-icon, manifest, theme-color, mobile-web-app-capable)
  • app/Providers/Filament/AdminPanelProvider.php — ->favicon('/favicon.svg') + renderHook HEAD_START (блок мета-тегов) + BODY_END (регистрация service worker)
  • app/Providers/Filament/ClientPanelProvider.php — то же самое для клиентской панели
  • resources/views/about.blade.php, shared-conversation.blade.php, telegram-share.blade.php — @include('partials.favicon-head') в <head>

Backend bober-bob

  • config/app.php — версия 0.27.1 → 0.27.3 (env('APP_VERSION', '0.27.3'))
  • resources/json/versions.json — запись 0.27.3 добавлена в начало истории
  • Проверка — на bober-bob.ipd.test версия платформы теперь 0.27.3
Полная версия →
v0.27.1 patch от 10.08.2026
Проверка сайта: исправлен раздел «Безопасность», вход «Запомнить меня» ~3 месяца, индикатор платформы в Telegram-ботах
Проверка тестовой площадки после недельного перерыва: восстановлен раздел «Безопасность» (падал с ошибкой при открытии), «Запомнить меня» на странице входа теперь включён по умолчанию и действует ~3 месяца (как у Google — повторный ввод пароля лишь спустя время, а не при каждом заходе), на странице «Телеграм боты» показана текущая платформа (test/stage/prod) и адрес n8n-telegram.

Раздел «Безопасность»

  • app/Filament/Pages/Security.php — запрос таблицы сессий переведён с DB::table() на Eloquent-модель (Filament требует Eloquent Builder); раньше страница падала с TypeError при открытии
  • app/Models/Session.php — новая модель для таблицы sessions (id-строка, каст last_activity в datetime)
  • Результат — раздел открывается: смена пароля и список активных сессий с кнопкой «Завершить остальные сессии»

Вход «Запомнить меня»

  • app/Filament/Auth/CustomLoginPage.php — чекбокс «Запомнить меня» включён по умолчанию (default(true))
  • config/auth.php — для guard web задан срок cookie «запомнить меня» 129600 минут (~3 месяца, 90 дней) вместо дефолтных 400 дней
  • Результат — после входа платформа помнит пользователя ~3 месяца, пароль спрашивается заново только после этого срока, а не при каждом заходе

Индикатор платформы в Telegram-ботах

  • app/Filament/Pages/TelegramBots.php — метод getPlatform(): текущий инстанс (test/stage/prod), его label, url и базовый адрес n8n-telegram
  • resources/views/filament/pages/telegram-bots.blade.php — бейдж «Платформа: Тестовый чат» с цветовой меткой и ссылкой на площадку + адрес n8n
  • Результат — сразу видно, с какой площадки смотрят переписку ботов

Backend bober-bob

  • config/app.php — версия 0.27.0 → 0.27.1 (env('APP_VERSION', '0.27.1'))
  • resources/json/versions.json — запись 0.27.1 добавлена в начало истории
  • Проверка — на bober-bob.ipd.test версия платформы теперь 0.27.1
Полная версия →
v0.27.0 minor от 03.08.2026
Верхний правый угол админ-панели: подпись пользователя и уведомления
Верхний правый угол админ-панели переработан: рядом с аватаром теперь подпись пользователя (имя и роль), появился колокольчик уведомлений с красным бейджем-циферкой непрочитанных событий (как в YouTube), список уведомлений в выпадающей панели и полноценная страница уведомлений с отметкой прочитанными.

Подпись пользователя

  • app/Providers/Filament/AdminPanelProvider.php — renderHook USER_MENU_BEFORE выводит блок с именем и ролью пользователя слева от аватара в верхнем правом углу
  • resources/views/filament/user-menu-caption.blade.php — имя + человекочитаемая роль (Администратор / Кладовщик / Поставщик / Тестировщик), тёмная тема учтена
  • Вместо анонимной буквочки — администратор сразу видит, кто зашёл в систему и с какой ролью

Колокольчик уведомлений

  • AdminPanelProvider.php — включён встроенный механизм Filament database notifications: колокольчик в топбаре с красным бейджем количества непрочитанных, выпадающий список последних событий
  • database/migrations/2026_08_03_013535_create_notifications_table.php — таблица notifications (uuid, morphs notifiable, data, read_at)
  • Модалка — список уведомлений, отметка «прочитано/не прочитано», удаление, «Отметить все прочитанными»

Страница уведомлений

  • app/Filament/Pages/Notifications.php — страница /admin/notifications (группа «Администрирование») с таблицей всех уведомлений: заголовок, описание, дата, статус прочтения
  • Действия — «Отметить прочитанным / непрочитанным», «Удалить», bulk «Удалить выбранные», кнопка «Отметить все прочитанными»
  • resources/views/filament/pages/notifications.blade.php — view страницы

События, порождающие уведомления

  • app/Services/NotificationService.php — сервис notifyAdmins/notifyUsers/notifyUser (синхронная запись в таблицу notifications, формат Filament)
  • app/Observers/MovementObserver.php — приход/расход/перемещение товара и изменение движений уведомляют администраторов
  • app/Observers/ProductObserver.php — добавление нового товара и низкий остаток (количество < 10)
  • app/Providers/AppServiceProvider.php — вход пользователя (кроме админа) уведомляет администраторов
  • UserResource/Pages/CreateUser.php — создание нового пользователя уведомляет администраторов
  • ProductResource/Pages/ListProducts.php — ошибка синхронизации товаров уведомляет администраторов

Backend bober-bob

  • config/app.php — версия 0.26.1 → 0.27.0 (env('APP_VERSION', '0.27.0'))
  • resources/json/versions.json — добавлена запись 0.27.0 наверх списка
  • Проверка — светлая и тёмная темы, колокольчик с бейджем, отметка прочитанными, /admin/notifications
Полная версия →
v0.26.1 patch от 03.08.2026
Ссылка на страницу версий в футере админ-панели
Версия платформы в нижнем левом углу админ-панели (футер сайдбара Filament) стала кликабельной ссылкой: теперь администратор может перейти по ней на страницу /admin/settings/versions и посмотреть полную историю версий платформы. Раньше это был обычный текст без ссылки.

Футер админ-панели

  • app/Providers/Filament/AdminPanelProvider.php — renderHook SIDEBAR_FOOTER: версия v{config('app.version')} обёрнута в ссылку на url('/admin/settings/versions')
  • Стили — сохранены классы футера (p-4, text-center, text-xs, border-t), добавлены hover:underline и hover:text-серый для явной индикации кликабельности
  • Удобство — версия в футере ведёт на страницу «Версии», где виден changelog всех релизов и «Информация о системе»

Единый источник версий

  • config/app.php — версия 0.26.0 → 0.26.1 (env('APP_VERSION', '0.26.1'))
  • resources/json/versions.json — добавлена запись 0.26.1 наверх списка; страницы /about и /admin/settings/versions показывают актуальную версию
  • Проверка — футер админки: клик по версии открывает /admin/settings/versions
Полная версия →
v0.26.0 minor от 02.08.2026
Витрина «О платформе» (/about) и единый источник версий
Страница /about полностью переработана в витрину в стиле admin-platform-heart: hero-блок с текущей версией платформы, сетка возможностей (складской учёт, Telegram-боты, ИИ-агенты, Google Таблицы, RBAC, отчёты), блок «Информация о системе» (PHP, Laravel, MariaDB, сервер), блок доверия (ООО «Студия ИПД»), контакты (Алексей Гапеев: Telegram/телефон/email) и история версий. Устранён источник дублирования: жёстко зашитый массив версий в routes/web.php удалён, страница /about теперь читает единый ресурс resources/json/versions.json (как и /admin/settings/versions). Версия платформы поднята до v0.26.0.

Витрина /about

  • Hero-блок — брендинг Бобер Боб (navy #0a0e27 + gold #c9a96e), бейдж «Платформа складского учёта», текущая версия платформы (config app.version)
  • Возможности — 6 карточек: складской учёт, Telegram-боты, ИИ-агенты, Google Таблицы, RBAC и безопасность, отчёты и экспорт
  • Информация о системе — версия платформы, PHP, Laravel + Filament v5 + Livewire, MariaDB utf8mb4, Bcrypt + Spatie Permission, сервер VDS 185.66.68.122 Ubuntu 22.04
  • Доверие — блок «Платформу развивает ООО «Студия ИПД»» с пояснением про юридическое лицо
  • Контакты — карточка Алексея Гапеева, ссылки Telegram @aleksey_gapeev, телефон +375 29 576-39-28, email info@ipd.by
  • История версий — рендер всех записей versions.json с бейджами типа (major/minor/patch) и меткой «Текущая» на активной версии
  • Полезные ссылки — «Войти в систему», «Админ-панель», ipd.by
  • Тёмная тема — только тёмный стиль, адаптив под мобильные

Единый источник версий

  • routes/web.php — жёстко зашитый массив $versions (строки 16–448) удалён; /about читает resource_path('json/versions.json')
  • resources/json/versions.json — единый источник: /about и /admin/settings/versions используют один и тот же файл
  • Паттерн — страница версий отдаёт массив ['app_version' => config('app.version'), 'versions' => json_decode(...)]

Backend bober-bob

  • config/app.php — версия 0.25.0 → 0.26.0 (env('APP_VERSION', '0.26.0'))
  • resources/views/about.blade.php — переписан полностью, standalone-шаблон (без layout), фирменные цвета Бобер Боб
  • Проверка — GET /about = 200, GET /admin/settings/versions = 200 на bober-bob.ipd.test; обе страницы показывают v0.26.0
Полная версия →
v0.25.0 minor от 01.08.2026
Карточки клиентов для бота bober-bob-client
Добавлена страница «Карточки клиентов» (/admin/client-cards, группа «Чаты»): список карточек клиентов бота bober-bob-client с синхронизацией с живым n8n-telegram.ipd.by (первоисточник). Персональный контекст клиента хранится в файле ai-kb/bots/bober-bob-client/clients/{telegram_id}.md на n8n-telegram и при разговоре подгружается ботом. Управление из админки bober-bob: просмотр списка (данные с живого через api/clients_list.php), создание новой карточки, редактирование и удаление. Запись/правка идёт через admin/action.php живого n8n-telegram (import_contact, kb_save, delete_contact) с использованием нового N8N_TELEGRAM_ADMIN_TOKEN из .env. Добавлен селектор ботов, детальный просмотр карточки с историей чата, подтверждение удаления и тосты об успехе/ошибке. Версия обновлена до v0.25.0.

Страница «Карточки клиентов»

  • Список клиентов — загрузка с живого n8n-telegram (api/clients_list.php: support-clients.md + clients/*.md + chat_history/*.md), кеш 60 сек, refresh=0 байпас кеша
  • Детали карточки — имя, telegram_id, бот, персональный контекст (markdown) и история чата (последние ходы)
  • Селектор ботов — переключение между ботами n8n-telegram (по умолчанию bober-bot-client)
  • Создание/редактирование — модал с полями (имя, telegram_id, контекст); создание через action.php create_client_card + kb_save, правка через import_contact/kb_save
  • Удаление — delete_contact с подтверждением; тосты об успехе/ошибке

API n8n-telegram

  • api/clients_list.php — POST с secret + target_bot_id; парсит support-clients.md, clients/*.md, chat_history/*.md; отдаёт {ok, target_bot_id, count, clients[]}
  • admin/action.php — AJAX-ответы JSON при ajax=1 или X-Requested-With: XMLHttpRequest для delete_contact, kb_save, create_client_card, import_contact (hub_ajax_reply)
  • Права — ai-kb/bots/bober-bot-client на живом: www-data:www-data (755, файлы 644); 11 эталонных файлов синхронизированы с локалью

Backend bober-bob

  • N8N_TELEGRAM_ADMIN_TOKEN — добавлен в .env/.env.example, ключ config/services.php admin_token
  • N8nTelegramService — getClients (кеш 60 сек, refresh=0 байпас), saveClientCard, deleteClientCard, createClientCard, saveClientFile, приватный postAdminAction (form POST на action.php?token=..., заголовок X-Requested-With)
  • ClientCardsController — index/save/delete/create; маршруты GET /admin/client-cards/data, POST /admin/client-cards/save|delete|create
  • Filament-страница — ClientCards (slug client-cards, группа «Чаты», navigationSort=13) + blade-шаблон

Технически

  • config/app.php — версия 0.24.6 → 0.25.0
  • routes/web.php — /about: блок 0.25.0
  • Тесты — ClientCardsTask75Test: рендер страницы, auth, index-клиенты, кеш/refresh, unknown bot 404, API error surface, save/delete/create, валидация, отсутствие утечки секретов (12 тестов, 35 ассертов)
  • Проверка — полный php artisan test зелёный (кроме предсуществующего ExampleTest 302); live-проверки api/clients_list.php (count=2) и action.php (kb_save → {"ok":true}) на живом n8n-telegram.ipd.by
Полная версия →
v0.24.6 patch от 01.08.2026
Автообновление переписки и подсказки по настройке ботов
Раздел «Телеграм боты» (/admin/telegram-bots) теперь обновляет переписку автоматически: каждые 15 секунд выполняется тихий poll с refresh=1, открытый диалог при обновлении не сворачивается, а новые ходы появляются сами с уведомлением «Появились новые сообщения». Добавлен переключатель «Автообновление: вкл/выкл» и живой индикатор «Обновлено: N сек назад». Исправлен корневой баг обновления: Cache::remember с TTL=0 возвращал устаревшие данные из кеша, из-за чего кнопка «Обновить» фактически не подтягивала свежие ходы — теперь refresh=1 полностью обходит кеш (getConversations/getConversationsWithMeta при cacheSeconds<=0 читают источник напрямую). Добавлен сворачиваемый блок «Как настроить бота»: подсказки про bot_id и target_bot_id, отправку ходов из n8n в api/log_turn.php, настройки N8N_TELEGRAM_BASE_URL/N8N_TELEGRAM_API_SECRET в .env, автообновление, тест соединения и получение прямой ссылки на сессию. Версия обновлена до v0.24.6.

Автообновление

  • Тихий poll каждые 15 секунд — loadConversations(refresh, silent) с refresh=1; открытый диалог не сворачивается, меню и модалы не перекрываются
  • Уведомление о новых сообщениях — при росте числа ходов показывается toast «Появились новые сообщения»
  • Переключатель — «Автообновление: вкл/выкл» в шапке страницы; пауза при открытых модалах и скрытой вкладке (document.hidden)
  • Индикатор свежести — «Обновлено: только что / N сек назад / N мин назад» в карточке бота

Исправление refresh (корень жалобы)

  • Баг — Cache::remember(key, 0, …) сначала читал живой ключ и возвращал устаревшие данные; refresh=1 не сбрасывал кеш
  • Фикс — N8nTelegramService: при cacheSeconds<=0 getConversations/getConversationsWithMeta идут напрямую в fetchRaw, минуя Cache::remember
  • Проверка — тест: новый ход на n8n-telegram появляется в ответе при refresh=1 сразу, без ожидания 60 сек

Подсказки по настройке

  • Блок «Как настроить бота» — сворачиваемая карточка: bot_id = target_bot_id, отправка ходов в api/log_turn.php, N8N_TELEGRAM_BASE_URL/N8N_TELEGRAM_API_SECRET в .env
  • Практика — автообновление каждые 15 сек, тест соединения, получение прямой ссылки на сессию через «⋯»

Технически

  • config/app.php — версия 0.24.5 → 0.24.6
  • routes/web.php — /about: блок 0.24.6
  • N8nTelegramService — приватный fetchWithMeta, ранний выход из кеша при cacheSeconds<=0
  • Тесты — TelegramBotsTask76Test: автообновление на странице, подсказки, refresh обходит кеш, новые ходы подтягиваются сразу, отсутствие утечки секрета (9 тестов, 34 ассерта)
  • Проверка — полный php artisan test зелёный (кроме предсуществующего ExampleTest 302); E2E в headless Chrome
Полная версия →
v0.24.5 patch от 01.08.2026
Телеграм боты: шрифт и контраст, кебаб-меню переписки, публичные ссылки на диалоги, нумерация диалогов
В разделе «Телеграм боты» (/admin/telegram-bots) шрифт интерфейса увеличен с 8-10px до 14px и усилен контраст текста (метки и значения вместо серых тонов). У каждой переписки появилось кебаб-меню с пунктами «Скопировать ссылку» и «Открыть в новом окне». Реализованы публичные ссылки на диалоги: при выборе пункта меню снимок диалога (имя бота, username, имя пользователя, пары «вопрос → ответ») сохраняется в таблицу telegram_conversation_shares (токен Str::random(40), уникальность по bot_key+session_id) и доступен без авторизации по /shared/telegram/{token}. Диалоги пронумерованы №1/№2/... и выводится общее число переписок. Версия обновлена до v0.24.5.

Страница Телеграм боты

  • Шрифт 14px — тексты интерфейса переведены с 8-10px на 14px (text-sm), значения читаемые (text-gray-800/text-gray-100 вместо серого на сером)
  • Кебаб-меню переписки — у каждого диалога пункты «Скопировать ссылку» (в буфер обмена, toast) и «Открыть в новом окне» (window.open)
  • Публичная ссылка — снимок диалога сохраняется в telegram_conversation_shares и доступен без авторизации по /shared/telegram/{token}
  • Нумерация диалогов — №1/№2/... на каждой переписке и общее число переписок

Данные и архитектура

  • TelegramConversationShare — модель: token(40), bot_key, bot_name, bot_username, session_id, username, user_id, started_at, data(json), created_by; turnCount()
  • TelegramShareController.store — snapshot свежего диалога (без кеша) в таблицу, firstOrNew по (bot_key, session_id), отдаёт ok/token/url; только для авторизованных
  • TelegramShareController.show — публичный просмотр по токену, view telegram-share (noindex)
  • routes/web.php — POST /admin/telegram-bots/share (auth), GET /shared/telegram/{token} (public)

Технически

  • config/app.php — версия 0.24.4 → 0.24.5
  • routes/web.php — /about: блок 0.24.5
  • Миграция — 2026_08_01_000001_create_telegram_conversation_shares_table (token 64 unique, unique(bot_key, session_id))
  • Тесты — TelegramBotsTask75Test: страница, share (auth) создаёт token/url, публичная страница 200 без авторизации, неверный token → 404, отсутствие утечки секрета
  • Проверка — полный php artisan test зелёный; E2E в headless Chrome (кебаб, ссылка, нумерация, шрифт 14px)
Полная версия →
v0.24.4 patch от 01.08.2026
Телеграм боты: раздел в настройках, управление ботами, переписка из n8n-telegram
Добавлен раздел «Телеграм боты» (/admin/telegram-bots) по образцу «ИИ агентов»: вкладки-селектор ботов (ботов может быть несколько), карточка выбранного бота (имя, username, bot_id, статус, число диалогов/сообщений, время и латентность обновления), панель переписки с раскрывающимися диалогами и парами «вопрос → ответ» из n8n-telegram (admin_dump.php, кеш 60 сек). Управление ботами — модал настроек (имя, username, описание, вкл/выкл, сброс к заводским), кебаб-меню, тест соединения с n8n-telegram и кнопка «Обновить». В /admin/settings добавлена карточка «Телеграм боты». Секрет API n8n-telegram убран из config/services.php в .env (N8N_TELEGRAM_BASE_URL, N8N_TELEGRAM_API_SECRET). TelegramBotConfigService хранит ботов в кеше (settings.telegram_bots) аналогично ai_agents. N8nTelegramService получил getConversationsWithMeta (ошибки, статус, латентность, fetched_at) и отдаёт явный ответ «данные не приходят» при недоступности API. Версия обновлена до v0.24.4.

Страница Телеграм боты

  • Вкладочки-селектор — список ботов (name + username + зелёный/серый статус); при нескольких ботах переключение между ними
  • Карточка бота — bot_id, статус «Включён/Выключен», число диалогов и сообщений, время обновления, латентность API
  • Переписка — раскрывающиеся диалоги, пары «вопрос пользователя → ответ бота» с цветовой маркировкой и временем, авто-скролл вниз, ссылка на дашборд n8n-telegram
  • Кебаб-меню — Настроить, Тест соединения, Обновить данные, Включить/Выключить (телепорт в body)
  • Модал настроек — имя, username, описание, зелёный переключатель «Включён», Сбросить к заводским
  • Модал теста — результат соединения, число диалогов, латентность
  • Ошибки — при недоступности API показывается «Данные не приходят» с подсказкой про N8N_TELEGRAM_* в .env

Данные и архитектура

  • TelegramBotConfigService — боты как объекты (key=bot_id, name, username, description, enabled), дефолты config/instances.php + оверрайды кеша settings.telegram_bots (TTL 30 суток)
  • N8nTelegramService.getConversationsWithMeta — ok/error/status/latency_ms/fetched_at; группы по сессиям, кеш 60 сек; refresh=1 сбрасывает кеш
  • TelegramController — conversations(bot, refresh), update, test; сохранена обратная совместимость ответа для дашборда
  • Безопасность — секрет n8n-telegram только в .env, дефолт в config/services.php удалён; в интерфейс/JSON он не попадает

Технически

  • config/app.php — версия 0.24.3 → 0.24.4
  • routes/web.php — POST /admin/telegram-bots/update, POST /admin/telegram-bots/test; /about: блок 0.24.4
  • /admin/settings — новая карточка «Телеграм боты»
  • Тесты — TelegramBotsTask74Test: страница, карточка в settings, conversations с Http::fake, update, test, отсутствие утечки секрета
  • Проверка — полный php artisan test зелёный; E2E в headless Chrome (вкладки, переписка, настройки, тест)
Полная версия →
v0.24.3 patch от 31.07.2026
ИИ-агенты: карточки со статусом, настройки, тест соединения, реальное подключение LLM
Раздел «AI Агенты» (/admin/ai-agents) переработан из формы в наглядные карточки: зелёный индикатор «Включён» (виден и на тёмной теме), детальная информация об агенте (версия, модель, API, тариф, подключение, источник данных, база знаний, баланс/токены), кебаб-меню с быстрым включением/выключением. Настройки каждого агента открываются модалом: имя, модель, провайдер API (regex/OpenAI/OpenRouter/Anthropic), API URL, API-ключ (хранится зашифрованным и показывается частично), подключение, источник данных, описание, база знаний, методология, вкл/выкл, сброс к заводским. Добавлены кнопка «Тест соединения» (проверяет агента: детерминированный режим или реальный вызов LLM) и автоматический запрос баланса (кредиты OpenAI/OpenRouter). В /admin/settings добавлена карточка «ИИ агенты». Реальная LLM-интеграция: AiAgentService.processWithLLM (OpenAI-совместимый chat/completions и Anthropic messages) с системным промптом на базе знаний и актуальных остатков склада; dispatch по агенту в SheetController.agentCommand: если у агента указан API-ключ — отвечает LLM, иначе — детерминированный regex-парсер. API-ключи — только в .env (AI_API, AI_OPENAI_KEY) и в шифрованном виде в кэше настроек. Версия обновлена до v0.24.3.

Страница AI Агенты

  • Карточки агентов — имя, ключ, зелёный/серый статус «Включён/Выключен» (работает на тёмной теме), метка провайдера
  • Информация об агенте — версия, модель, API, тариф, подключение, источник данных, статус API-ключа (маскирован), баланс/токены, база знаний
  • Кебаб-меню — Настроить, Тест соединения, Включить/Выключить (телепорт в body, как в ai-chat)
  • Модал настроек — все поля агента + зелёный переключатель «Включён» + Сбросить к заводским
  • Модал теста соединения — результат, латентность, пример ответа, повторный тест

Реальная LLM-интеграция

  • AgentConfigService — единый доступ к конфигурации агентов: дефолты config/instances.php + оверрайды кэша; API-ключ шифруется (Crypt::encryptString) и нигде не выводится целиком
  • AiAgentService.processWithLLM — OpenAI-совместимый POST {api_url}/chat/completions и Anthropic /messages; системный промпт из роли, методологии, базы знаний и актуальных остатков склада (stockSnapshot)
  • SheetController.agentCommand — диспетчер по агенту: есть API-ключ → LLM, иначе regex; выключенный агент отвечает отказом
  • Баланс — кредиты OpenAI (dashboard/billing/credit_grants) и OpenRouter (credits); для regex — «Встроенный (бесплатно)», для Anthropic — «не публикуется»

Настройки и безопасность

  • /admin/settings — новая карточка «ИИ агенты» → /admin/ai-agents
  • API-ключи — только в .env (AI_API, AI_OPENAI_KEY) и шифрованными в кэше; в интерфейсе — только маска sk-…xxxx
  • Тесты — Task67Test обновлён под новую страницу; добавлены тесты endpoints update/test/balance и LLM-пути с Http::fake

Технически

  • config/app.php — версия 0.24.2 → 0.24.3
  • routes/web.php — POST /admin/ai-agents/update, POST /admin/ai-agents/test, GET /admin/ai-agents/balance
  • Проверка — полный php artisan test зелёный; E2E в headless Chrome (карточка в settings, статусы, модал настроек, тест)
Полная версия →
v0.24.2 patch от 31.07.2026
Кебаб-меню работает: телепорт на <template>, модалы в скоупе, публичные ссылки диалогов
Исправлена ошибка из 0.24.1: меню «появлялось, но раздвигало поле» — Alpine предупреждал «x-teleport can only be used on a <template> tag»: директива была на <div>, из-за чего Alpine не инициализировал поддерево (без позиционирования и обработчиков, оверлей блокировал клики). Теперь единое меню на уровне страницы: <template x-teleport="body"> с x-show (элемент всегда в DOM — стили и клики работают), position:fixed по координатам кнопки «⋯», z-index 1000, закрытие прозрачным оверлеем. Модалы (Агенты, Поделиться, Редактировать, Оценить, Заметки, Удалить) перенесены внутрь x-data — пункты меню открывают их. Ссылки диалогов публикуются через уже публичный маршрут /admin/shared-conversation/{token} (без авторизации — можно открыть в инкогнито и передать клиенту). Версия обновлена до v0.24.2.

Исправление кебаб-меню (корень бага)

  • x-teleport только на <template> — в Alpine 3 директива работает исключительно на шаблоне; на <div> она не телепортировала меню, Alpine ронял инициализацию (cloneNode), меню оставалось в потоке и раздвигало таб-бар
  • Единое меню на уровне страницы — <template x-teleport="body"> вне цикла вкладок; x-show вместо x-if, чтобы элемент всегда был в DOM
  • position: fixed + getBoundingClientRect() — координаты по кнопке «⋯», прижатие к границам окна
  • Закрытие прозрачным оверлеем — fixed inset-0 z-index 999 перехватывает клики мимо меню (без гонки кликов, которая была у @click.outside с телепортом)
  • Модалы внутри x-data — Агенты/Поделиться/Редактировать/Оценить/Заметки/Удалить теперь в скоупе страницы, пункты меню открывают их

Публичные ссылки диалогов

  • /admin/shared-conversation/{token} — маршрут вне middleware auth: ссылку можно открыть без входа (инкогнито) и передать клиенту
  • Поделиться из меню — публикация создаёт share_token и URL; копирование кнопкой в модале

Технически

  • config/app.php — версия 0.24.1 → 0.24.2
  • Тесты — Task67Test расширен (assertSee menuConv/closeTabMenu), общий прогон зелёный
  • Проверка — воспроизведение в headless Chrome (Playwright) до и после фикса, E2E-проверка публичной ссылки без авторизации
Полная версия →
v0.24.1 patch от 31.07.2026
Кебаб-меню вкладок: не обрезается и видно целиком
Исправлен баг в /admin/ai-chat: кебаб-меню вкладки диалога обрезалось скролл-контейнером таб-бара (overflow-x-auto) и карточкой чата (overflow-hidden) — меню «загружалось тремя пикселями внизу» и перекрывалось другими элементами. Меню теперь телепортируется в <body> через Alpine x-teleport, позиционируется position:fixed по координатам кнопки «⋯» (расчёт через getBoundingClientRect), z-index поднят до 1000 — меню видно целиком, поверх всего, и не создаёт лишний скролл. Добавлены методы openTabMenu/closeTabMenu, меню закрывается по клику вне его (click.outside). Версия обновлена до v0.24.1.

Кебаб-меню вкладки

  • x-teleport="body" — меню переносится в <body>, минуя overflow-контейнеры (таб-бар overflow-x-auto, карточка overflow-hidden)
  • position: fixed + getBoundingClientRect() — координаты меню = позиция кнопки «⋯» (left, bottom+6), прижатие к границам окна
  • z-index: 1000 — меню поверх модалов и остальных элементов панели
  • closeTabMenu() — закрытие по клику вне меню (@click.outside) и при выборе пункта; открывается только одно меню (activeTabMenu)

Технически

  • config/app.php — версия 0.24.0 → 0.24.1
  • Тесты — test_ai_chat_page_renders расширен проверками x-teleport и z-index (Task67Test: 9/9 зелёные)
  • Сборка — php artisan view:cache, npm run build
Полная версия →
v0.24.0 minor от 31.07.2026
Дизайн чата: вкладки диалогов, большое поле ввода, агенты и их настройки
Интерфейс /admin/ai-chat переработан по требованиям Алексея: диалоги стали вкладочками-переключателями сверху (чат больше не уезжает вниз при множестве диалогов, при загрузке сразу виден первый диалог — скроллить не нужно). Поле ввода стало большим и раздвигающимся (минимум 2 строки, авто-рост до 50% высоты окна, растягивается за угол) с явной видимой кнопкой «Отправить» и индикатором «Отправка…». У каждого диалога — кебаб-меню (Поделиться, Редактировать, Оценить, Заметки, Удалить) и копирование ссылки у опубликованных. Добавлен знак «?» об агентах: модал показывает, чем отличаются агенты — описание, модель, подключение, база знаний, методология. Создана страница настройки агентов /admin/ai-agents с формой (имя, модель, подключение, описание, база знаний, методология, вкл/выкл). Агенты описаны в config/instances.php (default/analyst/support). Версия обновлена до v0.24.0.

Дизайн чата (требования Алексея)

  • Диалоги вкладочками — таб-бар сверху: «Новый диалог» + вкладка на каждый диалог; при загрузке автоматически открыт первый диалог; чат не смещается вниз при многих диалогах
  • Большое поле ввода — textarea rows=2, resize-y, min-h-[76px], авто-рост до 50% высоты окна, растягивается за угол вниз
  • Явная кнопка «Отправить» — видимая, со спиннером и текстом «Отправка…» во время запроса
  • Кебаб-меню на вкладке — Поделиться / Редактировать / Оценить / Заметки / Удалить; у опубликованных — иконка-ссылка копирования
  • Знак «?» об агентах — модал «Агенты платформы»: у каждого агента описание, модель, подключение, база знаний, методология и статус

Агенты и их настройки

  • config/instances.php — агенты как объекты: name, description, model, connection, knowledge (массив), methodology, enabled (default/analyst/support)
  • AiChat::getAgents() — дефолты из конфига + мерж с cache('settings.ai_agents'), knowledge как массив
  • Новая страница /admin/ai-agents — Filament-форма по секциям для каждого агента, действия «Сохранить» (в кеш) и «Сбросить»
  • Селект агента в чате — выбор агента перед отправкой + ссылка «Что за агенты?»

Технически

  • config/app.php — версия 0.23.1 → 0.24.0
  • Тесты — Task67Test: 9/9 зелёные (добавлены test_ai_agents_page_renders, test_agent_command_accepts_explicit_agent; test_ai_chat_page_renders расширен)
  • Сборка — npm run build (Tailwind: max-h-[50vh], min-h-[76px]), php artisan view:cache
Полная версия →
v0.23.1 minor от 31.07.2026
Дизайн чата как в ChatGPT: бетонный фон, полный ввод, явный шаринг
Интерфейс /admin/ai-chat переработан под стиль ChatGPT. Убран коричневый фон (панель Filament переведена с золотого #c9a96e на серый Color::Gray; тёмная тема заменена с «кирпичной» на серый бетон). Поле ввода растягивается на всю ширину, автоматически растёт по мере набора, отправка по Enter (Shift+Enter — новая строка). Список диалогов и область сообщений прокручиваются независимо. Кнопка «Поделиться» в шапке и в меню диалога открывает модал с явными действиями «Опубликовать» / «Отменить публикацию»; у опубликованных диалогов в списке слева появилась кнопка копирования ссылки. Версия обновлена до v0.23.1.

Дизайн /admin/ai-chat

  • Убран коричневый фон — primary панели Filament: #c9a96e → Color::Gray (серый)
  • Тёмная тема-бетон — resources/css/app.css: «кирпичные» #2d1810/#3d2218/#4d2a1f/#1a0f0a заменены на серые #1f2937/#374151/#4b5563/#111827
  • Полный ввод — textarea на всю ширину, авто-рост до 200px, Enter отправляет, Shift+Enter — новая строка
  • Прокрутка — список диалогов и сообщения прокручиваются независимо, ввод закреплён внизу

Шаринг

  • ShareController::toggleShare — поддержка явного параметра share=true/false (опубликовать / отменить)
  • Модал публикации — кнопки «Опубликовать» и «Отменить публикацию» (danger)
  • Ссылка в списке — у опубликованных диалогов кнопка копирования ссылки с подтверждением «Скопировано»

Технически

  • config/app.php — версия 0.23.0 → 0.23.1
  • Тесты — добавлен test_share_toggle_publishes_and_unpublishes_explicitly (Task67Test: 7/7 зелёные)
Полная версия →
v0.20.1 patch от 30.07.2026
Полная история версий: ретроспективное версионирование
Проведена полная ревизия всех 55+ заданий проекта Бобер Боб. Восстановлена непрерывная история версий: задокументированы 11 ранее пропущенных версий (v0.11.0→v0.20.0). Каждая версия содержит заголовок, техническое описание и секции с детализацией. Страница /admin/settings/versions обновлена. Версия обновлена до v0.20.1.

Версионирование

  • Ретроспектива — проанализированы 55+ файлов заданий и отчётов за 30.07.2026
  • 11 пропущенных версий — v0.11.0, v0.12.0, v0.13.0, v0.14.0, v0.15.0, v0.16.0, v0.16.4, v0.16.5, v0.17.0, v0.18.0, v0.19.0, v0.20.0
  • Каждая версия — заголовок + описание + секции (достижения, архитектура, статистика)

Изменённые файлы

  • resources/json/versions.json — добавлены 12 новых записей версий
  • config/app.php — версия обновлена до 0.20.1
  • routes/web.php — обновлён массив версий на странице /about
Полная версия →
v0.20.0 minor от 30.07.2026
Telegram-диалоги на дашборде: интеграция с n8n-telegram
Дашборд Google Sheets теперь отображает историю Telegram-диалогов бота @BBmsk_admin_bot. Создан N8nTelegramService, который проксирует данные из API n8n-telegram.ipd.by (admin_dump.php) и группирует по сессиям. Карточка Telegram Бот на дашборде стала интерактивной: раскрывающийся список диалогов с сообщениями пользователя и ответами AI. Добавлен публичный эндпоинт POST /webhook/telegram-log для прямой отправки ходов из n8n в bober-bob.

Архитектура

  • N8nTelegramService — сервис с кешированием (60 сек), группировка по сессиям, парсинг JSON
  • TelegramController — conversations() для дашборда (auth) + logTurn() для n8n (public)
  • Маршруты — GET /admin/telegram/conversations, POST /webhook/telegram-log

Дашборд

  • Telegram Бот — карточка с количеством диалогов, раскрывающийся список сессий
  • Каждая сессия — user → bot пары с цветовой маркировкой (голубой/серый)
  • Live-обновление — данные с кешированием 60 сек через n8n-telegram API

Конфигурация

  • .env — N8N_TELEGRAM_BASE_URL, N8N_TELEGRAM_API_SECRET
  • config/services.php — секция n8n_telegram с base_url и secret

Статистика

  • Новые файлы: 2 (N8nTelegramService.php, TelegramController.php)
  • Изменённые файлы: 3 (google-sheets-dashboard.blade.php, routes/web.php, config/services.php)
  • Версия: 0.19.0 → 0.20.0
Полная версия →
v0.19.0 minor от 30.07.2026
Дизайн чата AI-агента и страницы sidebar
Исправлен стиль чата AI-агента на дашборде: сообщения ассистента перекрашены в серую гамму (bg-gray-200, text-gray-800, border-gray-400). Созданы две новые страницы в sidebar: «n8n Webhook» (N8nWebhookSettings) в группе «Интеграции» и «Мониторинг системы» (SystemMonitor) в группе «Основное». Версия обновлена до v0.19.0.

Дизайн чата

  • assistant bubble — bg-gray-200, text-gray-800, border-gray-400 (было bg-white, text-gray-900, border-gray-200)
  • loading — bg-gray-200, border-gray-400, text-gray-500

Новые страницы

  • N8nWebhookSettings (sidebar) — группа «Интеграции»: URL, secret, тестовая форма, инструкция для n8n
  • SystemMonitor (sidebar) — группа «Основное»: 3 карточки статистики (БД, кеш, запросы) + 6 сервисов с цветными индикаторами

Статистика

  • Новые Filament-страницы: 2 · Sidebar группы: Интеграции + Основное
  • Версия: 0.18.0 → 0.19.0
Полная версия →
v0.18.0 minor от 30.07.2026
n8n-вебхуки: AI-агент через внешний запрос
Создан N8nWebhookController с эндпоинтами POST /webhook/ai (приём запросов, логирование в AiConversation, вызов AiAgentService, JSON-ответ) и GET /webhook/ai/health (диагностика со статусом таблицы). Добавлен Bearer token auth через config('services.n8n.webhook_secret'), CSRF-исключение, дашборд-карточка с тестовой формой.

Webhook

  • POST /webhook/ai — валидация (text, user_id, source, agent), логирование, вызов AiAgentService, JSON-ответ
  • GET /webhook/ai/health — версия, PHP, Laravel, статус Google Sheets (sheet_name, last_sync)
  • Bearer token — hash_equals() сравнение с config('services.n8n.webhook_secret')

Sidebar и дашборд

  • N8nWebhookSettings — страница sidebar: URL, secret, тестовая форма JSON
  • Карточка n8n Webhook — на дашборде: endpoint, метод, auth bearer, формат, тест

Статистика

  • Новые файлы: 1 (N8nWebhookController.php) · Изменённые: 3
  • Версия: 0.17.0 → 0.18.0
Полная версия →
v0.17.0 minor от 30.07.2026
AI-диалоги: AiConversation модель и SheetController
Создана модель AiConversation с миграцией (conversation_id, user_id, telegram_chat_id, role, content, metadata, agent, source). Разработан SheetController с тремя методами: conversations() — получение истории диалогов, agentCommand() — вызов AI-агента из панели, telegramWebhook() — приём Telegram-запросов с отправкой ответов. Создана страница AiChat (sidebar, группа «Интеграции») для просмотра всех диалогов.

Модель и БД

  • AiConversation — поля: id, conversation_id (indexed), user_id, telegram_chat_id, role, content (text), metadata (json), agent, source, timestamps
  • Scope forConversation() — фильтр по conversation_id
  • Scope forUser() — фильтр по user_id

SheetController

  • conversations() — GET /admin/sheets/conversations — история для текущего пользователя
  • agentCommand() — POST /admin/sheets/agent — вызов AiAgentService + логирование
  • telegramWebhook() — POST /webhook/telegram — приём Telegram update, AI-обработка, отправка ответа

Страница AI Чаты

  • AiChat (sidebar) — группа «Интеграции»: список всех диалогов, пользователи, превью, раскрытие
  • Фильтрация — по conversation_id, source

Статистика

  • Новые файлы: 3 (модель, миграция, контроллер) · Новые страницы: 1
  • Версия: 0.16.5 → 0.17.0
Полная версия →
v0.16.5 patch от 30.07.2026
Рефакторинг: SyncLogs, Settings, Security, AuditSummary
Страницы SyncLogs, Settings, Security и AuditSummary переписаны с использованием стандартных компонентов Filament. Blade-шаблоны сокращены: кастомный HTML-код форм заменён на {{ $this->form }}. Исправлен конфликт reset() с Livewire (переименован в resetForm()). Старые CSS-правила (fi-section-content) удалены.

Рефакторинг

  • SyncLogs — переписан на HasForms + getFormSchema(), 6 PHP-классов + 6 Blade-шаблонов
  • Settings, Security, AuditSummary — единый подход Filament Forms
  • Исправление — reset() → resetForm() (конфликт имён с Livewire)
  • CSS — удалён устаревший .fi-section-content из app.css

Статистика

  • Страниц переписано: 4 · PHP-классов: 6 · Blade-шаблонов: 6
  • Версия: 0.16.4 → 0.16.5
Полная версия →
v0.16.4 patch от 30.07.2026
Принудительная тёмная тема: единый dark-mode
Платформа переведена на принудительную тёмную тему: удалён переключатель light/dark, все шаблоны используют только dark-варианты стилей. Основной фон — bg-gray-900, текст — text-gray-200/300/400/500. Единая мягкая цветовая схема для панели настроек и безопасности. Исправлен рендеринг SVG-иконок (@svg() → x-filament::icon).

Тёмная тема

  • Принудительный dark-mode — переключатель light/dark удалён, все элементы только dark
  • 6 Blade-шаблонов — stat, icon, versions, action, security-wrapper, blitz-badge обновлены
  • Единая схема — text-gray-200/300/400/500 для всей панели настроек

Исправления

  • SVG-иконки — @svg() → x-filament::icon (правильный рендеринг в Filament v5)
  • CSS — добавлены правила для select option в тёмной теме

Статистика

  • Шаблонов обновлено: 6 · CSS-правил добавлено: 5
  • Версия: 0.16.0 → 0.16.4
Полная версия →
v0.16.0 minor от 29.07.2026
Синхронизация с Google Таблицей и журнал синхронизации
Добавлена синхронизация товаров с Google Таблицей: ProductSyncService с автоопределением колонок (Название, Артикул, Категория, Цена) и upsert товаров по артикулу. Создана страница «Журнал синхронизации» (/admin/sync-logs) с историей всех операций импорта. Логирование через Spatie Activitylog. Кнопка «Синхронизировать» на странице товаров.

ProductSyncService

  • Автоопределение колонок — поиск заголовков: Название, Артикул, Категория, Цена, Остаток, Единица
  • Upsert — обновление/создание товаров по артикулу
  • Валидация — проверка обязательных полей, дубликатов, типов данных

Журнал синхронизации

  • SyncLogs — страница с таблицей: дата, пользователь, создано/обновлено/ошибки, статус
  • Spatie Activitylog — log_name: sync, все операции с детализацией
  • Кнопка «Синхронизировать» — на странице товаров, запуск импорта

Статистика

  • Новые сервисы: 1 · Новые страницы: 1 · Новые Blade: 2
  • Версия: 0.15.x → 0.16.0
Полная версия →
v0.15.0 minor от 29.07.2026
Google Таблицы: интеграция, Ignition, экраны и уведомления
Реализована интеграция с Google Sheets API: SheetConfig модель, GoogleSheetService (read/write/append/update), привязка таблицы через Filament Resource. Установлен Ignition (интеграция с Spatie). Создана страница Screens и система уведомлений (NotificationController, NotificationLogs).

Google Sheets

  • SheetConfig — модель с полями: name, url, sheet_id, range, is_active, last_sync_at
  • GoogleSheetService — readFromConfig(), writeToCell(), appendRow(), updateRow()
  • SheetConfigResource — CRUD в Filament, привязка таблицы через URL

Экраны и уведомления

  • Screens — страница управления экранами (визуальные состояния)
  • NotificationController — REST API для уведомлений
  • NotificationLogs — история отправленных уведомлений

Исправления

  • Ignition — установлен и настроен для интеграции со Spatie
  • Критические ошибки — исправлено 3 бага при работе с Google API

Статистика

  • Новые сервисы: 1 · Новые модели: 1 · Новые страницы: 3
  • Версия: 0.14.0 → 0.15.0
Полная версия →
v0.14.0 minor от 28.07.2026
Удаление Inertia: полный переход на Filament (Blade/Livewire)
Кардинальная архитектурная перестройка: удалены все React/TypeScript/Inertia компоненты. 26 .tsx-файлов удалены. Удалены пакеты inertiajs, react, react-dom, tailwindcss, postcss, autoprefixer, typescript. InertiaServiceProvider деактивирован. 4 Inertia-контроллера переписаны на стандартные Laravel Blade. Платформа полностью переведена на Filament (Blade/Livewire).

Архитектура

  • Удалены — 26 React/TypeScript/Inertia компонентов и страниц
  • Удалены пакеты — inertiajs/inertia-laravel, inertiajs/react, react, react-dom, tailwindcss, postcss, autoprefixer, typescript
  • Деактивирован — InertiaServiceProvider из bootstrap/providers.php

Миграция

  • 4 контроллера переписаны: DashboardController, AuthController (Inertia → Blade redirects)
  • Все страницы — Blade/Filament, больше никаких React SPA

Статистика

  • Файлов удалено: 26 .tsx · Пакетов удалено: 8 · Контроллеров переписано: 4
  • Версия: 0.13.0 → 0.14.0
Полная версия →
v0.13.0 minor от 28.07.2026
UserMenu, NotificationBell, регистрация и верификация
Добавлен UserMenu в правом верхнем углу с аватаром, именем, ролью и кнопкой выхода. NotificationBell с выпадающим списком последних уведомлений. Реализована регистрация через email с 5-значным кодом подтверждения. Привязка номера телефона к учётной записи.

UserMenu

  • UserMenu — аватар, имя, роль, кнопка выхода (TopRight)
  • NotificationBell — выпадающий список последних 5 уведомлений

Регистрация

  • Регистрация — через email, 5-значный код подтверждения
  • Верификация — подтверждение email перед доступом к панели
  • Телефон — привязка номера к учётной записи

Статистика

  • Новые компоненты: 2 (UserMenu, NotificationBell) · Новые страницы: 2 (Register, Verify)
  • Версия: 0.12.0 → 0.13.0
Полная версия →
v0.12.0 minor от 28.07.2026
Тёмная тема по умолчанию и User Switcher
Тёмная тема установлена по умолчанию для всех пользователей. Добавлен User Switcher — переключение между 5 тестовыми учётными записями (Administrator, Warehouse, Partner, Test, User). Решён конфликт авторизации Filament через кастомный LoginPage.

Тёмная тема

  • Dark mode — установлен по умолчанию, отключён переключатель light/dark
  • Filament panel — darkMode: true в PanelProvider

User Switcher

  • 5 учётных записей — Administrator, Warehouse Worker, Partner, Test, обычный User
  • Switcher UI — выпадающий список с быстрым переключением

Статистика

  • Новые компоненты: 2 · Пользователей: 5 тестовых
  • Версия: 0.11.0 → 0.12.0
Полная версия →
v0.11.0 minor от 28.07.2026
Рефакторинг страниц настроек на Filament Forms
Все страницы настроек (/admin/settings/*) переписаны с использованием HasForms + getFormSchema(). 6 PHP-классов созданы (SettingsGeneral, Appearance, Typography, Notifications, Mail, Deploy). Blade-шаблоны сокращены: кастомный HTML заменён на {{ $this->form }}. Исправлен конфликт reset() с Livewire.

Архитектура

  • HasForms — все страницы настроек используют Filament Forms API
  • 6 PHP-классов — SettingsGeneral, Appearance, Typography, Notifications, Mail, Deploy
  • Blade-шаблоны — кастомный HTML-код форм заменён на {{ $this->form }}

Исправления

  • reset() → resetForm() — устранён конфликт имён с Livewire компонентом
  • CSRF — добавлен meta csrf-token для форм Filament

Статистика

  • PHP-классов: 6 · Blade-шаблонов сокращено: 6
  • Версия: 0.10.1 → 0.11.0
Полная версия →
v0.10.1 patch от 28.07.2026
Обновление страницы версий и типографика
Полная переработка страницы Release Notes: обновлена типографика с улучшенной контрастностью, добавлены цветовые акценты на ключевых технологиях, убрана вся конфиденциальная информация (учётные данные, пароли, порты). Версионность теперь безопасна для публичного доступа. Текущая версия платформы обновлена до v0.10.1.

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

  • Удалены все учётные данные — пароли, имена пользователей, IP-адреса, порты SSH удалены из всех записей версий
  • Безопасность публикации — страница версий теперь безопасна для публичного доступа в интернете

Типографика

  • Улучшена контрастность — даты и описания теперь имеют достаточный контраст для чтения
  • Цветовые акценты — ключевые технологии выделены золотым цветом (#c9a96e)
  • Жирные акценты — важные термины и компоненты выделены жирным шрифтом
  • Структурированные секции — каждая версия разделена на логические блоки (описание, технологии, статистика)

Статистика

  • Версий задокументировано: 18 (v0.1.0 → v0.10.1)
  • Версия: 0.10.0 → 0.10.1
Полная версия →
v0.10.0 minor от 28.07.2026
Переработка страницы входа и создание страницы «О платформе»
Полная переработка страницы авторизации по образцу MedTech: логотип БОБЕР БОБ, заголовок, описание для пользователей, форма входа с поддержкой светлой и тёмной тем. Создана публичная страница «О платформе» (/about) с описанием системы, технической информацией, полезными ссылками и историей версий. Добавлен переключатель темы (light/dark) с сохранением выбора в localStorage. Версия обновлена до v0.10.0.

Страница входа

  • Новый дизайн — логотип БОБЕР БОБ (SVG), заголовок «Вход в систему», подзаголовок «Платформа автоматизации складского учёта»
  • Описание для пользователей — краткая инструкция по использованию системы
  • Переключатель темы — кнопка в правом верхнем углу для переключения light/dark
  • Ссылка на About — версия внизу формы кликабельна и ведёт на страницу «О платформе»
  • Поддержка темы — все элементы адаптируются под выбранную тему (light/dark)

Страница «О платформе»

  • Публичная страница — доступна без авторизации по адресу /about
  • Описание платформы — Бобер Боб: система управления складами, товарами и остатками
  • Техническая информация — версия, PHP, стек (Laravel 13 + Filament v5 + React), БД, сервер
  • Полезные ссылки — Войти в систему, Админ-панель, ipd.by, GitHub
  • История версий — 9 ключевых версий с описанием изменений

Инфраструктура

  • Переключатель темы (ThemeToggle.tsx) — компонент с иконками луна/солнце, localStorage
  • Inline script в app.blade.php — предотвращение flash-of-wrong-theme при загрузке
  • Tailwind CSS v4 — добавлен `@custom-variant dark` для class-based dark mode

Статистика

  • Новые компоненты: ThemeToggle.tsx, About.tsx
  • Обновлённые файлы: Login.tsx, app.blade.php, app.css, routes/web.php, config/app.php
  • Версия: 0.9.2 → 0.10.0
Полная версия →
v0.9.2 patch от 27.07.2026
Деплой на staging и production окружения
Развёртывание платформы на боевых серверах: staging (bober-bob-dev.ipd.by) и production (bober-bob.ipd.by). Инфраструктура: Nginx с SSL, MariaDB 10.6, VDS. Настроены DNS-записи через Cloudflare, выпущены SSL-сертификаты, настроен reverse proxy для Laravel. Обе площадки отвечают HTTPS 200.

Деплой staging

  • Nginx — reverse proxy для Laravel, SSL termination, статические ресурсы
  • SSL-сертификат — выпущен через Let's Encrypt, автоматическое обновление
  • MariaDB 10.6 — база данных staging, пользователь с ограниченными правами
  • DNS — A-запись через Cloudflare, настроен proxy

Деплой production

  • Бекап предыдущей версии — архив кода и дамп базы данных перед обновлением
  • Миграция данных — импорт структуры БД и тестовых данных
  • Проверка — все маршруты отвечают корректно (login, dashboard, admin)

Статистика

  • Серверы: 2 (staging + production)
  • Версия: 0.9.1 → 0.9.2
Полная версия →
v0.9.1 patch от 27.07.2026
Восстановление тестовых данных
Восстановление тестовых данных после migrate:fresh. Создан бекап v0.9.0 в архиве. Проверена корректность работы всех модулей после пересоздания базы данных.

Восстановление

  • Тестовые данные — восстановлены после migrate:fresh --seed
  • Бекап v0.9.0 — создан в архиве для отката

Статистика

  • Версия: 0.9.0 → 0.9.1
Полная версия →
v0.9.0 minor от 27.07.2026
RBAC, Filament v5, Excel Export, Client Panel
Реализована ролевая модель доступа (RBAC) через Filament Shield: 70 разрешений для 4 моделей, 4 роли. Установлена Filament v5 — PHP-админ-панель для Laravel с 4 CRUD-ресурсами. Добавлен экспорт данных в Excel, дашборд-виджет LowStockWidget и отдельная панель для клиентов.

RBAC через Filament Shield

  • 70 разрешений — view/create/edit/delete для 4 моделей (Product, Warehouse, Stock, Movement) + дополнительные
  • 4 роли — Administrator (полный доступ), Warehouse (складские операции), Partner (товары и остатки), Test (тестирование)
  • Воспроизводимый сидер — roles и permissions создаются автоматически при migrate:fresh --seed

Filament v5

  • ProductResource — CRUD + фильтры + badge-категории + пагинация
  • WarehouseResource — CRUD + stocks_count (количество остатков)
  • StockResource — CRUD + relationship select + expiry_date
  • MovementResource — view-only + type badge (приход/расход) + фильтры

Дополнительный функционал

  • Excel Export — экспорт отфильтрованных данных в .xlsx на страницах Products, Stocks, Movements
  • LowStockWidget — дашборд-виджет с 5 карточками статистики (товары, склады, остатки, дефицит)
  • Client Panel — отдельная Filament-панель для розничных клиентов с read-only каталогом

Установленные компоненты

  • filament/filament v5.7.3, bezhansalleh/filament-shield v4.3.0, pxlrbt/filament-excel v3.6.1, maatwebsite/excel v3.1.69

Статистика

  • Permissions: 70 · Роли: 4 · Resources: 4 · CRUD-страницы: 13 · Панели: 2 (Admin + Client)
  • Версия: 0.6.0 → 0.9.0
Полная версия →
v0.6.0 minor от 23.07.2026
Filament v5 admin panel: CRUD ресурсы, роли, база знаний
Установлена Filament v5.7.3 — PHP-админ-панель для Laravel. Созданы 4 CRUD-ресурса: ProductResource, WarehouseResource, StockResource, MovementResource. Добавлен role middleware на все маршруты настроек. Создана база знаний по Laravel (12 секций).

Filament Resources

  • ProductResource — CRUD + фильтры + badge-категории + пагинация
  • WarehouseResource — CRUD + stocks_count (количество остатков на складе)
  • StockResource — CRUD + relationship select (Product, Warehouse) + expiry_date
  • MovementResource — view-only + type badge (приход/расход) + фильтры по типу и дате

Исправления Filament v5 API

  • Schema вместо Form — form() принимает Filament\Schemas\Schema (изменение API v5)
  • BackedEnum для иконок — navigationIcon требует BackedEnum|string|null
  • UnitEnum для групп — navigationGroup требует UnitEnum|string|null

Статистика

  • Filament Resources: 4 · CRUD Pages: 13 · Role middleware: 9 маршрутов · База знаний: 12 секций
  • Версия: 0.5.0 → 0.6.0
Полная версия →
v0.5.0 minor от 23.07.2026
Sidebar, Settings, /admin/ routes
Создан постоянный левый сайдбар (AdminLayout.tsx) с SVG-иконками, навигационными секциями и информацией о пользователе. Добавлен SettingsLayout.tsx с горизонтальными вкладками для 9 страниц настроек. Все маршруты перенесены под /admin/* префикс с 301-редиректами.

Навигация

  • AdminLayout.tsx — постоянное левое меню (256px): SVG-иконки, навигационные секции (Основное, Склад, Администрация), информация о пользователе, badge роли, кнопка выхода
  • SettingsLayout.tsx — горизонтальные вкладки для страниц настроек
  • 9 страниц настроек — General, Appearance, Typography, Security, Notifications, Mail, Deploy, Versions, History

Маршрутизация

  • /admin/* префикс — все маршруты перенесены под единый префикс
  • 301-редиректы — старые маршруты автоматически перенаправляют на новые

Статистика

  • Маршруты: 41 · Страницы настроек: 9 · Layout компоненты: 2
  • Версия: 0.4.0 → 0.5.0
Полная версия →
v0.4.0 minor от 22.07.2026
CRUD товаров, складов, остатков, движений
Реализован практический функционал платформы: 5 миграций (products, warehouses, pallets, stocks, movements), 5 Eloquent-моделей с связями и Spatie Activity Log, 3 контроллера с CRUD + CSV-экспорт, 9 React-страниц. Дашборд показывает реальную статистику.

Миграции и модели

  • 5 миграций — products, warehouses, pallets, stocks, movements. Foreign keys, timestamps, indexes
  • 5 Eloquent моделей — Product, Warehouse, Pallet, Stock, Movement. Связи (belongsTo, hasMany), Spatie Activity Log

Контроллеры и страницы

  • ProductController — CRUD + CSV-экспорт + фильтрация
  • WarehouseController — CRUD + stocks_count
  • StockController — CRUD + stock in/out операции
  • 9 React-страниц — Products (Index/Create/Edit/Show), Warehouses (Index/Create/Edit), Stock/Index, Movements

Dashboard

  • Реальная статистика — количество товаров, складов, стоимость остатков, движения за сегодня
  • CSV-экспорт — скачивание списка товаров в формате CSV
  • Seed data — 10 товаров, 2 склада, 10 движений для тестирования

Статистика

  • Миграции: 5 · Модели: 5 · Контроллеры: 3 · React-страницы: 9 · Маршруты: 25
  • Версия: 0.3.1 → 0.4.0
Полная версия →
v0.3.1 patch от 21.07.2026
4 роли, 4 пользователя, ролевой Dashboard
Расширена ролевая модель с 2 до 4 ролей: Administrator, Warehouse Worker, Partner, Test. Dashboard.tsx обновлён: динамические карточки модулей в зависимости от роли пользователя. RolesAndAdminSeeder воспроизводимо создаёт роли и пользователей.

Ролевая модель

  • 4 роли — Administrator (полный доступ), Warehouse Worker (складские операции), Partner (товары и остатки), Test (тестирование)
  • 4 учётные записи — каждая роль имеет свою тестовую учётную запись
  • Ролевой Dashboard — разные модули для разных ролей: Administrator видит всё, Warehouse Worker — остатки/движения/товары, Partner — товары/остатки

Статистика

  • Роли: 4 · Пользователи: 4 (каждый с уникальной ролью)
  • Проверено: все 4 роли авторизуются и видят контент по ролям
  • Версия: 0.3.0 → 0.3.1
Полная версия →
v0.3.0 minor от 21.07.2026
Авторизация, роли, Dashboard
Реализована система авторизации: Login.tsx — форма входа с React Hook Form + Zod, клиентская + серверная валидация, дизайн в фирменных цветах. Dashboard.tsx — дашборд с информацией о пользователе и навигацией. AuthController — login/logout с редиректами. HandleInertiaRequests middleware.

Авторизация

  • Login.tsx — форма входа (login + пароль) с React Hook Form + Zod, клиентская + серверная валидация
  • AuthController — login/logout, редиректы (guest → login, auth → dashboard)
  • HandleInertiaRequests — передаёт auth.user + flash в React
  • Zod schemas — auth.ts для валидации форм

Dashboard

  • Dashboard.tsx — дашборд с информацией о пользователе, ролью, навигацией
  • Защита — auth middleware на всех маршрутах дашборда

Исправления

  • Auth key mapping — Auth::attempt() требует ключ email. Исправлено маппингом credentials
  • CSRF token — добавлен meta csrf-token в app.blade.php для Inertia POST-запросов

Статистика

  • Страницы: Login, Dashboard · Контроллеры: 1 · Маршруты: 3 · Исправления: 2 критических бага
  • Версия: 0.2.1 → 0.3.0
Полная версия →
v0.2.1 patch от 21.07.2026
Modern ecosystem: TypeScript, Sanctum, Spatie, React Hook Form
Установлена современная экосистема пакетов для Laravel и React. Laravel Sanctum для API-токенов. Spatie Permission для ролевой модели. Spatie Activity Log для аудит-лога. TypeScript для строгой типизации. React Hook Form + Zod для форм. TanStack Query для кеширования.

Установлено

  • Laravel Sanctum — API-токены для интеграций
  • Spatie Permission — ролевая модель (admin/user)
  • Spatie Activity Log — аудит-лог для складских операций
  • TypeScript — строгий режим, tsconfig.json
  • React Hook Form + Zod — формы с валидацией
  • TanStack Query — кеширование данных, background-обновления
  • clsx + tailwind-merge — утилиты для className

Настроено

  • Spatie Permission: конфиг + 5 миграций (roles, permissions, model_has_roles, model_has_permissions, role_has_permissions)
  • Spatie Activity Log: конфиг + 1 миграция (activity_log)
  • TypeScript: vite-env.d.ts, types/index.ts, строгий режим
  • Git — инициализирован репозиторий, .gitignore настроен

Статистика

  • Пакеты: 10 новых · TypeScript: 0 ошибок · Vite build: успешен
  • Версия: 0.2.0 → 0.2.1
Полная версия →
v0.2.0 minor от 21.07.2026
Laravel 13 + React + Inertia: новая платформа
Полная перезапись платформы: старый MVC-код заменён на Laravel 13.20.0 + React 19 + Inertia.js v3.1.1. Установлен Vite 8.1.5 для сборки. Созданы Welcome.jsx и app.blade.php. БД: MariaDB (utf8mb4), 9 миграций Laravel.

Установлено

  • Laravel 13.20.0 — современный PHP-фреймворк
  • React 19 + ReactDOM 19 — клиентская часть
  • Inertia.js v3.1.1 — связка Laravel + React (JS + PHP adapters)
  • Vite 8.1.5 — сборка: React JSX + Tailwind CSS + Inertia

Что добавлено

  • Welcome.jsx — приветственная страница с логотипом БОБЕР БОБ
  • app.blade.php — точка входа Inertia с CSRF-токеном
  • БД — MariaDB (utf8mb4), 9 миграций Laravel

Исправления

  • InertiaServiceProvider — в Laravel 13 не обнаруживается автоматически. Зарегистрирован вручную в bootstrap/providers.php

Статистика

  • Стек: Laravel 13 + React 19 + Inertia v3 + Vite 8 + Tailwind CSS · БД: 9 таблиц
  • Vite build: CSS 35.5KB, JS 316KB · HTTP: 200 OK
  • Версия: 0.1.6 → 0.2.0
Полная версия →
v0.1.6 patch от 21.07.2026
Деплой на dev/prod, enterprise дизайн
Полная переработка визуального стиля: cartoon-бобёр заменён на абстрактную геометрическую композицию + словесный знак БОБЕР БОБ. Цвета: тёмно-синий #1a237e + золотой #c9a96e (corporate navy+gold). Деплой на staging и production. Создана резервная копия v0.1.6.

Enterprise дизайн

  • Абстрактная геометрическая композиция + словесный знак БОБЕР БОБ (вместо cartoon-бобра)
  • Цвета — тёмно-синий #1a237e + золотой #c9a96e (corporate navy+gold)
  • 4 CSS-файла обновлены (login, dashboard, about, general)

Деплой

  • Staging — развёрнут на VDS, бекап предыдущей версии, импорт БД
  • Production — DROP+CREATE БД, импорт данных staging
  • Проверка — login 302, dashboard 200, version 0.1.6

Резервная копия

  • DB dump — полный дамп базы данных
  • code.zip — архив исходного кода
  • README + changelog — документация версии

Статистика

  • Серверы: 2 (staging + production) · Резервная копия: DB dump + code.zip + README
  • Версия: 0.1.0 → 0.1.6
Полная версия →
v0.1.5 patch от 20.07.2026
SVG-логотип: стилизованный бобёр
Создан профессиональный SVG-логотип (~1.5KB) — стилизованный бобёр, тёмно-зелёный фон, тематика складского учёта. Логотип интегрирован в страницу логина и заголовок приложения.

Что добавлено

  • SVG-логотип — стилизованный бобёр, тёмно-зелёный фон, тематика складского учёта (~1.5KB)
  • Интеграция в login page и app layout

Статистика

  • Формат: SVG (векторный, масштабируемый) · Размер: ~1.5KB
  • Версия: 0.1.4 → 0.1.5
Полная версия →
v0.1.4 patch от 20.07.2026
Безопасность: очистка конфиденциальных данных
Критическое исправление безопасности: конфиденциальная информация удалена из публичного контента. About-страница переработана: техническая информация оформлена в формате Markdown с подзаголовками.

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

  • Удалена конфиденциальная информация — учётные данные, пароли, порты удалены из публичного контента
  • Создан бекап — архив предыдущей версии для отката

Описание платформы

  • About-страница переработана: техническая информация оформлена в формате Markdown с подзаголовками
  • Жирное выделение ключевых слов (технологии, функции, компоненты)

Статистика

  • Безопасность: конфиденциальная информация удалена из публичного доступа
  • Версия: 0.1.3 → 0.1.4
Полная версия →
v0.1.3 patch от 20.07.2026
Глубокая очистка контента от MedTech
Полная очистка глубинных медицинских ссылок, оставшихся от шаблона MedTech. Проверены 17 файлов (5 контроллеров, 2 сервиса, 10 страниц). Grep: 0 вхождений «медtech» после очистки.

Очистка контента

  • 17 файлов проверены и очищены от медицинских ссылок
  • Grep: 0 вхождений «медtech» после очистки
  • Версионирование исправлено: начато с v0.1.0 (дата создания Бобер Боб)

Статистика

  • Файлы проверены: 17 · Вхождений «медtech»: 0 (было 20+)
  • Версия: 0.1.2 → 0.1.3
Полная версия →
v0.1.2 patch от 20.07.2026
Контент: замена MedTech на Бобер Боб
Замена контента: медицинская тематика → «Автоматизация складского учёта Бобер Боб». Обновлены 11 файлов: контроллеры, шаблоны, настройки. About-страница: описание платформы для складского учёта, логистики, импорта продовольствия.

Контент-замена

  • 11 файлов обновлены: контент MedTech → «Автоматизация складского учёта Бобер Боб»
  • About-страница — описание платформы для складского учёта, логистики, импорта продовольствия

Статистика

  • Файлы обновлены: 11 · Тематика: медицина → логистика/складской учёт
  • Версия: 0.1.1 → 0.1.2
Полная версия →
v0.1.1 patch от 19.07.2026
Nginx + SSL + Domain
Настроен веб-сервер Nginx на VDS для bober-bob.ipd.by. SSL-сертификат выпущен через Certbot (Let's Encrypt). MariaDB: импортирована база данных, создан пользователь с ограниченными правами. Cloudflare DNS: A-запись для bober-bob.ipd.by.

Инфраструктура

  • Nginx — reverse proxy для Laravel, SSL termination, статические ресурсы
  • SSL — Certbot (Let's Encrypt), автоматическое обновление
  • MariaDB — база данных, пользователь с ограниченными правами
  • Cloudflare DNS — A-запись для bober-bob.ipd.by

Исправления

  • Session handler — исправлен .user.ini: session.save_path
  • Opcache — opcache_reset удалён (вызывал белый экран)
  • Маршруты — добавлены недостающие маршруты для Inertia

Статистика

  • HTTP: 200 OK · HTTPS редирект
  • Версия: 0.1.0 → 0.1.1
Полная версия →
v0.1.0 major от 18.07.2026
VDS + Nginx + MariaDB: начальная инфраструктура
Развёртывание VDS-сервера для проекта Бобер Боб. Ubuntu 22.04, Nginx, MariaDB. Cloudflare: DNS-зона для *.ipd.by, wildcard SSL. SSH-ключ для доступа. fail2ban, UFW, rate limiting для безопасности.

Инфраструктура

  • VDS-сервер — Ubuntu 22.04, выделенные ресурсы
  • MariaDB — сервер баз данных с аутентификацией
  • Cloudflare — DNS-зона для *.ipd.by, wildcard SSL
  • SSH — ключевой доступ для безопасного подключения
  • Безопасность — fail2ban, UFW (firewall), rate limiting

Бэкапы

  • Автоматические SQL-дампы — регулярное создание копий БД
  • .env резервные копии — сохранение конфигурации

Статистика

  • ОС: Ubuntu 22.04 · БД: MariaDB · Веб-сервер: Nginx
  • Версия: 0.1.0
Полная версия →