72b6879f4b
- Refactored max_bot from nested packages to flat module structure - Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets) - Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT) - Q1: Broadcast preview modal with 10s confirmation timer - Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary) - Q4: bot_settings showNotification(), editable max_bot_id - Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret - Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists() - Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py - Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings - Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py - Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
220 lines
19 KiB
Markdown
220 lines
19 KiB
Markdown
# Changelog — AegisOne Service Portal
|
||
|
||
## 1.7.0 (29.05.2026)
|
||
### Новые функции
|
||
- **Прокси-роуты для бота:** /api/bot/webhook с пробросом X-Max-Bot-Api-Secret
|
||
- **Страницы бота:** bot_consent.html (превью + таймер 10 сек), bot_kb.html (✏️ редактирование), bot_settings.html (showNotification, max_bot_id)
|
||
- **Тосты:** глобальная showNotification() в base.html, CSS-классы .toast-* в service.css
|
||
- **CSS-переменные:** var(--white)→var(--bg-card), var(--text)→var(--text-primary) во всех шаблонах
|
||
### Исправления
|
||
- Проброс secret через webhook-прокси
|
||
|
||
## 1.5.5 (23.05.2026)
|
||
### Новые функции
|
||
- Этап 4 завершён: все 8 feature-обработчиков (risk_score, sla_status, photo_report, appointment, quality_rate, commercial, my_objects, sla_ticket)
|
||
- max_notifications.py: notify_operator, notify_level2, notify_client, notify_handoff_escalation, notify_ticket_created
|
||
- emotion_detector.py + categorizer.py: GPT с fallback на keywords
|
||
- Handoff-диалоги (/service/bot-settings/handoffs) с polling и кнопкой "Взять в работу"
|
||
- Уведомления бота (/service/bot-settings/notifications) + mark-read
|
||
- API: handoffs, notifications, risk-questions (CRUD), tickets (list/get/create/message/status), engineers
|
||
- Страница "Вопросы риск-инжиниринга" (bot_risk_questions.html) — управление через портал
|
||
- Страница "Заявки" (bot_tickets.html) — просмотр, создание, детали, сообщения, смена статуса
|
||
- risk_score.py переписан: чтение вопросов из БД (BotRiskQuestion) вместо хардкода
|
||
- SQL миграция v1.5.5: CREATE TABLE для bot_notifications, bot_notification_subscriptions, bot_risk_questions, bot_tickets, bot_ticket_messages, bot_ticket_statuses + seed-данные
|
||
- MaxAPIClient.test_mode — заглушка для тестового прогона без отправки в MAX
|
||
- /api/bot/test-run — вызывает handle_update с test_mode, симулируя настоящий диалог
|
||
- portal_settings.html: кнопка тестового прогона с живой симуляцией
|
||
- role_settings.html: новые permission (bot_tickets, bot_notifications, bot_risk_questions)
|
||
- Сайдбар: добавлены "Заявки" и "Вопросы риск-инжиниринга" в раздел Чат-бот Max
|
||
- Пользователи (users.html): колонка MAX ID + поле в форме создания/редактирования
|
||
### Исправления и улучшения
|
||
- bot_engine.py: callback `rate_*` → прямой вызов quality_rate handler
|
||
- bot_engine.py: добавлен вызов notify_handoff_escalation при негативных эмоциях
|
||
- Users stub: login, full_name, role, is_active, max_user_id
|
||
- Proxy-роуты py_service: добавлены все API для risk-questions, tickets, engineers
|
||
- Тесты max_bot: проверка всех роутов
|
||
- **Добавлена фича "Напоминания"** — reminders.py handler, состояние FEATURE_REMINDERS в FSM, кнопка в меню
|
||
- **broadcasts.py зарегистрирован** — добавлен в _handle_feature (main_menu.py) и в build_main_menu_buttons (inline.py)
|
||
- **FSM.transition("done")** — все feature-хендлеры теперь возвращают в MAIN_MENU вместо IDLE, показывают меню
|
||
- **FSM изоляция** — risk_score, appointment, commercial переписаны с set_temp/get_temp вместо прямого доступа к _states
|
||
- **settings_cache.py** — исправлены get_phones() (парсит phone_1/phone_2) и get_email() (читает support_email)
|
||
- **Delete forms** — bot_categories.html, bot_kb.html, bot_settings.html: заменены form POST на fetch() с JSON
|
||
- **SQL миграция v1.5.5 исправлена** — bot_notifications + recipient_max_user_id/related_*, подписки с boolean-колонками
|
||
- **Версия обновлена до 1.5.5
|
||
|
||
## 1.5.4 (22.05.2026)
|
||
### Новые функции
|
||
- Страница Handoff-диалогов (bot_handoffs.html) с polling
|
||
- Страница Уведомлений бота (bot_notifications.html) с mark-read
|
||
- API: handoffs, notifications, risk-questions, tickets, engineers (max_bot/main.py)
|
||
- max_notifications.py: уведомления операторам, level2, клиентам, эскалация
|
||
- emotion_detector.py + categorizer.py: модули GPT + keyword fallback
|
||
- risk_score.py: анкета 7 вопросов с in-memory хранением через FSM
|
||
- Уведомления FSM (notifications.py + broadcasts.py): подписка / отписка
|
||
- Users stub (login, full_name, role, max_user_id)
|
||
- Пользователи: колонка MAX ID + поле в форме (users.html)
|
||
- SQL миграция v1.5.5 (черновик)
|
||
### Исправления и улучшения
|
||
- risk_score.py: переключение с хардкода на БД (BotRiskQuestion)
|
||
- bot_engine.py: маршрутизация feature-состояний через _feature_handlers
|
||
- bot_engine.py: callback rate_* → прямой вызов handle_quality_rate
|
||
|
||
## 1.5.3 (22.05.2026)
|
||
### Новые функции
|
||
- П.8: Роли: обновлён список MENU_ITEMS под новую структуру (7 секций: Панель, Управление, Работа, Чат-бот Max, Контент, Внешние системы, Настройки)
|
||
- П.8: Коэффициенты и Тест формул объединены в одну страницу **Формулы** (/service/formulas) с 2 табами
|
||
- П.8: Чат-бот Max в Настройках — 6 табов (Общие, Шаблоны ответов, Функции, Категории, База знаний, Тестовый прогон)
|
||
- П.8: Расширены дефолтные права engineer (charts, bot_analytics, bot_conversations)
|
||
- Переключатель ролей в navbar: owner может переключиться на engineer/technician, engineer — на technician
|
||
- Тема: текст (Светлая/Тёмная/Авто) перенесён во всплывающую подсказку (title) на кнопке
|
||
- Тесты (pytest): проверка регистрации всех роутов smoke-тест для сервера
|
||
### Исправления и улучшения
|
||
- Все старые отдельные страницы (formula_test, coefficients, bot_responses, bot_features, bot_categories, bot_kb, bot_test_runner) продолжают работать через прямые роуты
|
||
- Исправлен баг: BotTicket FK → bot_users (NoReferencedTableError при старте)
|
||
|
||
## 1.5.2 (21.05.2026)
|
||
### Новые функции
|
||
- П.8: Настройка портала (/service/portal-settings) — Yandex GPT ключ, Яндекс.Диск OAuth
|
||
- П.8: Настройка Ролей (/service/role-settings) — owner управляет видимостью пунктов меню для engineer/technician
|
||
- Ролевые права меню: sidebar скрывает пункты на основе role_menu_permissions
|
||
### Исправления и улучшения
|
||
- max_bot: Исправлен NameError в api_bot_features (добавлен импорт BotFeature)
|
||
- py_service: Добавлен PermissionsMiddleware для загрузки прав меню в каждый шаблон
|
||
- SQL: Дефолтные права engineer (10 пунктов) и technician (4 пункта) создаются при пустой таблице
|
||
|
||
## 1.5.1 (21.05.2026)
|
||
### Новые функции
|
||
- П.8: Рассылка с предпросмотром — выбор получателей (чекбоксы), живой предпросмотр, черновик, история рассылок
|
||
- П.8: Фильтр согласия ФЗ-152 — рассылка только с `consent_given = true`
|
||
### Исправления и улучшения
|
||
- П.8: Аналитика — "Всего пользователей" теперь показывает только согласных, карточка согласий удалена
|
||
- П.8: Пользователи — сортировка по всем колонкам (клик на заголовок), пагинация, фильтр по согласию
|
||
- П.8: Пользователи — строки без согласия выделены красным фоном
|
||
- max_bot: Broadcast API — preview (draft) + send режимы, recipients endpoint, history endpoint
|
||
- py_service: Прокси-роуты для recipients/history
|
||
|
||
## 1.5.0 (21.05.2026)
|
||
### Новые функции
|
||
- Интеграция бота Max "София": управление ботом в сервисном портале
|
||
- 11 новых страниц: настройки, шаблоны, функции, категории, база знаний, диалоги, пользователи, тестовый прогон, аналитика
|
||
- SQL миграция v1.5.0: bot_tickets, bot_features.sla_ticket
|
||
|
||
## 1.4.0 (20.05.2026)
|
||
|
||
## 1.3.0 (20.05.2026)
|
||
### Новые функции
|
||
- П.49: Подключены favicon (ico, png, webmanifest, apple-touch-icon) + лого на странице логина
|
||
- П.44: Сохранение scroll сайдбара при навигации (sessionStorage)
|
||
- П.47: Липкий тулбар редактора документов (верх/низ)
|
||
- П.33: Кастомный модал подтверждения выхода из опросника (вместо системного confirm)
|
||
- П.33: Добавлен POST /service/questionnaire/save/{step} — сохранение черновика
|
||
### Исправления и улучшения
|
||
- П.35: Версия ПО отображается на всех страницах, не только дашборде
|
||
- П.40: Звёзды избранного выровнены в одну строку с пунктами меню
|
||
- П.42: discover_docs() вызывается при каждом открытии документа — новые .md сразу видны
|
||
- П.43: POST /admin/permissions использует discover_docs вместо load_permissions
|
||
- П.45: Футер сайдбара: имя → выход → версия
|
||
- П.46: Иконки EasyMDE видны на тёмной теме ([data-theme="dark"] overrides)
|
||
- П.48: Создание "Пример из практики" — добавлен action="/service/cases/create"
|
||
- П.29: SLA — action="/service/sla/create" у формы + safe type conversions в edit
|
||
- П.31: Идеи — защита от None description ((idea.description or '')[:100])
|
||
- П.49: Назначения — a.object_name → a.object.name, a.user_name → a.user.full_name
|
||
- П.26: Заголовок "Назначения" → "Назначение сотрудников"
|
||
- П.24: Объекты — список клиентов в select (c.id/c.name вместо c[0]/c[1])
|
||
- П.24: Объекты — editObject защита от None customer_id + safe int() в backend
|
||
- П.23: Валидация клиентов: * у обязательных полей, KPP (9 цифр), маска телефона "8 (___) ___-__-__"
|
||
- П.36: Portainer URL https://81.177.141.34:9443
|
||
|
||
## 1.2.1 (20.05.2026)
|
||
### Новые функции
|
||
- П.38: Стилизация логина — "One" цветом #00ADEF
|
||
- П.45: Футер сайдбара: имя → выход → версия
|
||
- П.44: Сохранение scroll сайдбара при навигации (sessionStorage)
|
||
- П.47: Липкий тулбар редактора документов
|
||
- П.49: Подключены favicon (ico, png, webmanifest, apple-touch-icon)
|
||
### Исправления и улучшения
|
||
- П.35: Версия ПО отображается на всех страницах, не только дашборде
|
||
- П.40: Звёзды избранного выровнены в одну строку с пунктами меню
|
||
- П.42: discover_docs() вызывается при каждом открытии документа — новые .md сразу видны
|
||
- П.43: Управление документами — POST использует discover_docs вместо load_permissions
|
||
- П.46: Иконки EasyMDE видны на тёмной теме
|
||
- П.48: Создание "Пример из практики" — добавлен action="/service/cases/create"
|
||
- П.29: SLA — добавлен action="/service/sla/create" у формы, safe type conversions
|
||
- П.31: Идеи — защита от None description (|default(''))
|
||
- П.49: Назначения — a.object_name → a.object.name, a.user_name → a.user.full_name
|
||
- П.26: Заголовок "Назначения" → "Назначение сотрудников"
|
||
- П.24: Объекты — список клиентов в select (c.id/c.name вместо c[0]/c[1])
|
||
- П.36: Portainer URL через https://81.177.141.34:9443
|
||
- П.33: Опросник — добавлен POST /service/questionnaire/save/{step}, кастомный модал
|
||
|
||
## 1.2.0 (20.05.2026)
|
||
### Доработки
|
||
- П.21: Кнопка "Настроить" на дашборде — выбор отображаемых показателей (localStorage)
|
||
- П.22: Исправлена ошибка Internal Server Error при редактировании пользователя (добавлен action у формы)
|
||
- П.23: Исправлена ошибка Method Not Allowed при создании клиента; ИНН обязателен (10/12 цифр)
|
||
- П.24: Тип объекта переведён на русский (select вместо input)
|
||
- П.25: Исправлена ошибка Method Not Allowed при создании/редактировании объекта
|
||
- П.26: "Назначения" → "Назначение сотрудников"
|
||
- П.27: Статус SLA по умолчанию — "Переговоры" (negotiation)
|
||
- П.28: Уровни SLA отображаются на русском: Базовый/Оптимальный/Максимальный
|
||
- П.29: Проверена работа создания и редактирования SLA контрактов
|
||
- П.30: Расширены графики: группировка (день/неделя/месяц), название, сохранение/экспорт PNG
|
||
- П.31: Исправлена ошибка Internal Server Error при смене статуса идеи
|
||
- П.32: Быстрое меню заменено на звёздочки (★) — избранное в localStorage
|
||
- П.33: Кнопка "Выйти" в опроснике с подтверждением сохранения черновика
|
||
- П.34: Убрана надпись "Главная" под каждым меню
|
||
- П.35: Версия показывается полностью только на дашборде, в остальных — "v"
|
||
- П.36: Ссылка Portainer изменена на IP:порт (через PORTAINER_URL)
|
||
- П.37: Документация: левое меню (page.html), авто-загрузка .md из /py_service/docs
|
||
|
||
## 1.1.0 (18.05.2026)
|
||
### Баги
|
||
- discover_docs: миграция существующих permissions без technician — добавляется technician: {view: false} + engineer: {edit: false, cancel: false}
|
||
- favicon: исправлен тип (image/x-icon → image/svg+xml) и расширение (favicon.ico → favicon.svg)
|
||
### Доработки
|
||
- П.15: Визуальная система формул — коэффициенты сгруппированы по formula_ref в аккордеоны
|
||
- П.15: Информация о формуле (📐) — модалка с текстом формулы и описанием результата
|
||
- П.15: Песочница формул (/service/coefficients/test) — подстановка параметров и расчёт для 7 формул:
|
||
risk_score, complexity, object_index, engineer, ecs, shs, ceo_shs
|
||
- П.15: Иконка 🧪 у каждой группы ведёт в песочницу с предвыбором группы
|
||
- П.15: В сайдбар добавлена ссылка "Тест формул" (owner)
|
||
- CSS: добавлены стили аккордеона и панели теста формул
|
||
|
||
## 1.0.3 (18.05.2026)
|
||
### Баги
|
||
- П.18: Ченджлог не открывался — CHANGELOG.md исключался .dockerignore (*.md убран)
|
||
- П.20: Ошибка при сохранении пользователя — исправлена логика is_active (без дефолта), phone/email не сбрасываются
|
||
### Доработки
|
||
- П.12: Авто-добавление документов из /py_service/docs через discover_docs() в lifespan
|
||
- П.13: Владелец редактирует .md файлы через /service/documents/{slug}/edit (EasyMDE)
|
||
- П.14: Система прав документов:
|
||
- Владелец видит/создаёт/редактирует/удаляет все документы
|
||
- Владелец назначает engineer'у просмотр/редактирование через /service/documents/admin/permissions
|
||
- Engineer видит только назначенные документы
|
||
- Engineer даёт technician'у просмотр своих документов через /service/documents/tech-access
|
||
- Technician видит только те документы, что открыл engineer
|
||
- П.15: Удаление коэффициентов (кнопка ✕); предложен редизайн с группировкой по formula_ref
|
||
- П.16: Гибкие графики для владельца (/service/charts) — Chart.js: задачи/SHS/KPI/MRR/объекты, типы: bar/line/pie/doughnut
|
||
- П.17: "Service Portal" увеличен с 10px до 12px
|
||
- П.19: Роль убрана из футера сайдбара, "Выйти" под ФИО
|
||
- Удалены дублирующие ручки /service/docs* (старая система), везде /service/documents/
|
||
|
||
## 1.0.2 (18.05.2026)
|
||
### Доработки
|
||
- П.3: Логотип AegisOne в sidebare (sidebar-logo-text, 2rem)
|
||
- П.5: Версия кликабельна — модалка с историей изменений (changelog)
|
||
- П.6: Текст логотипа увеличен (sidebar-logo-text, 2rem)
|
||
- П.7: Верхнее меню упрощено — только логотип и кнопка темы
|
||
- П.8: Быстрое меню — настройка своих и техниковских ссылок (owner/engineer)
|
||
- П.9: Система идей — CRUD + статусы (normal/in_progress/completed)
|
||
- П.11: Ссылки на Portainer и Gitea в левом меню (owner)
|
||
|
||
## 1.0.1 (18.05.2026)
|
||
|
||
## 1.0.0
|
||
### Новые функции
|
||
- Первый запуск сервисного портала на FastAPI
|
||
- Базовые страницы: логин, дашборд, документация
|
||
- Авторизация (owner/engineer/technician)
|
||
- Дашборд с основной статистикой (объекты, задачи, инциденты, SLA, SHS)
|