Files
site_aegisone/py_service/CHANGELOG.md
T

338 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog — AegisOne Service Portal
## 1.9.0 (04.06.2026)
### Новые функции
- **Phase 0 — Инфраструктура CRM/лидов:**
- Новые таблицы: `leads` (20 полей), `call_records` (20 полей CDR), `client_notifications` (10 полей), `pbx_settings` (27 полей)
- Расширены модели: `User` (extension — внутренний номер PBX), `Customer` (lead_source, last_call_at, total_calls, total_leads, merged_into, статусы draft/merged), `Task` (lead_id — FK → leads), `AuditLog` (entity_type, entity_id, field, old_value, new_value)
- Миграции БД: система `migrations_runner.py` с авто-применением при старте, отслеживание в `_applied_migrations`
- SQL-миграция `001_phase0_infrastructure.sql`: 31 операция (CREATE TABLE → ALTER TABLE в правильном порядке)
- Шифрование паролей PBX через `cryptography.fernet` (PBXSettings)
### Исправления
- **documents_router.py:** доступ «Владелец/Инженер» для tech-access — `!= "engineer"``not in ("engineer", "owner")`
### Документация
- **AGENTS.md:** раздел 0.4 — обязательные файлы для чтения; раздел 1 — ссылка на архитектуру сервера
- **SERVICE_STYLE_GUIDE.md:** единый гайд UI
- **other/Yeastar_S20.md:** полная документация по PBX (AMI, MySQL CDR, FTP, SSH)
- **other/LEAD_IMPLEMENTATION_PLAN.md:** 8-фазный план (0-7) реализации CRM/лидов
- **other/1C_UNF_INTEGRATION.md:** документация по интеграции с 1С:УНФ 3.0 через OData API
- **other/voronka.md:** документ жизненного цикла лидов
## 1.8.6 (02.06.2026)
### Новые функции
- **sort-table.js:** универсальный модуль сортировки таблиц по столбцам (текст/число/дата), подключён глобально
- **Number input:** спиннеры скрыты через CSS (`appearance: textfield`) на всех страницах
### Исправления
- **customers.html:** восстановлена сломанная HTML-структура — `.card` > `.card-header`, поиск в `.filter-bar`
- **bot_dialogues.html:** обёрнут в `.card` > `.card-header`, фильтры в `.filter-bar`, удалены кастомные `.page-header`/`.header-controls`
- **checklist.html:** `<h3>` обёрнут в `.card-header`
- **18 страниц:** `modal-actions``form-actions` (единый класс для кнопок в модалках)
- **charts.html:** `btn-xs``btn-sm`
- **assignments.html:** добавлена модалка подтверждения отвязки сотрудника
- **4 AJAX-страницы:** `sortTables()` вызывается после загрузки данных (bot_kb, bot_unknown, bot_consent, bot_tickets)
## 1.8.5 (02.06.2026)
### Новые функции
- **AGENTS.md (раздел 12):** правила по Идеям — агент может видеть, добавлять, менять статус, предлагать к реализации, реализовывать
### Исправления
- **models.py:** `onupdate="NOW()"``onupdate=func.now()` — fix Internal Server Error при смене статуса Идеи (14 моделей)
- **page.html:** удалён `main-header` (заголовок + дата) — больше не дублируется на всех страницах
- **dashboard.html:** удалён `main-header`
- **bot_dialogues.html:** удалён CSS `.main-header { display: none !important; }` (больше не нужен)
- **version.txt / CHANGELOG.md:** синхронизация версии в контейнере aegisone-app
## 1.8.4 (02.06.2026)
### Новые функции
- **SERVICE_STYLE_GUIDE.md:** единый гайд стилей сервисного портала
- **AGENTS.md (раздел 11):** правила стилей UI — см. SERVICE_STYLE_GUIDE.md
- **CSS `.modal-actions`:** общий класс для кнопок в модалках
### Исправления
- **bot_dialogues.html:** скрыт `main-header` (дублирующий заголовок с датой)
- **bot_kb.html:** замена кастомных классов на `.modal-overlay`/`.modal`, `confirm()` → кастомная модалка, иконки ✎/✕
- **bot_unknown.html:** `.modal-box``.modal`, `confirm()` → кастомная модалка, иконки ✎/✕
- **bot_consent.html:** `confirm()` → кастомная модалка удаления пользователя
- **bot_test.html:** `confirm()` → кастомная модалка очистки тестовых данных
- **charts.html:** `prompt()` → кастомная модалка ввода имени графика, `confirm()` → кастомная модалка удаления
- **role_settings.html:** `alert()``showNotification()`
- **10 простых страниц:** blog, cases, coefficients, customers, formulas, ideas, objects, questionnaire_config, tasks, users — `confirm()` → кастомные модалки с уникальными ID
- **migrations_runner.py:** split SQL на `;` для совместимости с asyncpg
## 1.8.3 (02.06.2026)
### Новые функции
- **Docstrings:** добавлены docstrings и комментарии по AGENTS.md ко всем ключевым Python-файлам
- **File headers:** каждый файл имеет шапку с описанием назначения
- **Function docstrings:** каждая функция имеет docstring на русском языке
## 1.8.2 (02.06.2026)
### Новые функции
- **AGENTS.md:** правила проекта для AI-агентов (корень репозитория)
- **Отзыв согласия:** handle_revoke_consent(), паттерн «отозвать согласие» в handle_message
- **Удаление бот-пользователей:** DELETE /api/bot/users/{user_id} (каскад: user + conversations + messages)
- **Кнопка удаления:** bot_consent.html — колонка «Действия» (только owner)
- **consent_revoked_date:** поле в BotUser для фиксации даты отзыва согласия
### Исправления
- **Диалоги:** одна переписка = одна карточка (убрано создание new conv при completed/escalated)
- **Analyze intent:** агрессивное определение ticket по ключевым словам услуг
- **Clarify intent:** ограничение 1 раз за диалог, маркерные слова пропускают уточнение
- **History context:** фильтр по времени (10 мин) вместо лимита 10 сообщений
- **Быстрые правила:** ticket-паттерны и приветствие до NLP
## 1.8.1 (01.06.2026)
### Новые функции
- **YandexGPT-only NLP:** удалены Groq/Gemini, YandexGPT единственный провайдер
- **Unknown questions:** BotUnknownQuestion, автогенерация KB-карточки при 3+ уникальных пользователях
- **Callback dedup:** processed_callbacks set в main.py — пропуск дублей callback_id
- **Consent flow:** split-based word matching, refuse words до quick_intent, operator handler
- **DELETE conversations:** каскадное удаление диалогов (BotMessage + BotProcessingLog + BotConversation)
- **UTC+3:** moscow_now() в greeting.py и inquiry.py
- **Bot tickets:** contact_name, contact_phone, contact_email в BotTicket
### Исправления
- **Plain text phones:** MAX Platform не рендерит markdown-ссылки — телефоны/emailplain text
- **Webhook secret:** _verify_secret() возвращает True если заголовок пуст
- **Nginx:** добавлен /webhook proxy на HTTP порт 80
- **Payload parsing:** message_created из body.message.body.text, message_callback из body.callback.payload
## 1.8.0 (01.06.2026)
### Новые функции
- **Consent flow:**.keyboard consent_keyboard(), contact_keyboard(), return_to_consent_keyboard()
- **Escape hatch:** locked states проверяют analyze_intent — «question» → analyze_and_respond
- **Completed state:** completed/escalated → новый диалог + analyze_and_respond
- **handle_greeting fix:** убран analyze_and_respond после приветствия, state=awaiting_input
- **Auto-detect sidebar:** parse_sidebar_menu() определяет пункты меню через API
- **role_settings:** парсинг sidebar menu из HTML
### Исправления
- **handle_message:**拒绝 слова проверяются ДО analyze_intent в состояниях consent
- **operator_words:** «оператор» → contacts вместо analyze_intent
- **handle_manual_contact:** refuse words → consent_refused вместо «введите корректный номер»
- **clarify_intent:** temperature 0.1, пост-обработка удаление приветствий, anti-AI-signs
## 1.7.1 (29.05.2026)
### Исправления
- **bot_test.html:** исправлен ключ localStorage для темы, var(--bg-page)→var(--bg-body), стилизация скроллбара
- **P2 (CSS):** bot_consent, bot_tickets, bot_kb, bot_settings — var(--light-bg)→var(--bg-card), хардкод цвета→CSS-переменные
- **M7 (bot_test.html):** тема наследуется через CSS-переменные + скрипт инициализации
- **C3 (Email typo):** contact proxy — user.email вместо user.phone
## 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)