- Добавлен SSE endpoint (aiassist/ai_sse.php) для real-time получения ответов от n8n
- Обновлен n8n_proxy.php: убран callback, добавлена передача Redis параметров в n8n
- Обновлен ai-drawer-simple.js: переход с polling на SSE с fallback через Redis
- Добавлен check_redis_response.php для прямого чтения из Redis кэша
- Добавлена документация: N8N_REDIS_SETUP.md, N8N_REDIS_FIX.md, AI_DRAWER_REDIS_SSE.md
- Поддержка plain text ответов от n8n (автоматическое определение формата)
- Кэширование ответов в Redis для надежности (TTL 5 минут)
Создан api_attach_documents.php:
✅ Прямой эндпоинт без backend proxy
✅ URL: https://crm.clientright.ru/api_attach_documents.php✅ Принимает массив документов из n8n
✅ Умная обработка S3 путей (добавляет хост если нужно)
✅ Поддержка file/file_url, filename/file_name
✅ Привязка к HelpDesk или Project (зависит от ticket_id)
✅ Проксирует к upload_documents_to_crm.php
✅ Полное логирование в logs/api_attach_documents.log
Готово к использованию в n8n!
Изменения в upload_documents_to_crm.php:
✅ Добавлена логика привязки к HelpDesk (заявке) если указан ticket_id
✅ Если ticket_id не указан - привязываем к Project (старая логика)
✅ Обновлена функция normalizeInputData для передачи ticket_id
✅ Добавлено логирование привязки к HelpDesk/Project
Использование:
- Передать ticket_id в payload → документ привязывается к HelpDesk
- Не передавать ticket_id → документ привязывается к Project
- ✅ CreateWebProject.php: возвращает массив (не json_encode)
- ✅ CreateWebProject.php: ob_start/ob_end_clean для глушения warnings
- ✅ Удалён closing tag ?> и лишние переносы
- ✅ webservice.php: ob_clean() после includes (удаляет BOM)
- ✅ Результат: чистый JSON без BOM и переносов
- 🎯 N8N теперь корректно парсит ответ
Связанные изменения:
- erv_platform: claim_id генерируется только в n8n
- Упрощённая операция создания проекта: обязательно policy_number + contact_id
- Логика: если проект с таким полисом существует - возвращает ID БЕЗ обновления
- Если не существует - создаёт новый проект
- Поля:
* projectname: 'ERV {полис} цифровой адвокат'
* projectstatus: 'модерация'
* projecttype: 'ерв урегулирование'
* linktoaccountscontacts: привязка к контакту
* cf_1994: Заявитель (контрагент 67458)
* cf_1885: номер полиса
* cf_1887, cf_1889: периоды страхования (опционально)
- Возвращает JSON: {"project_id": "123", "is_new": true/false}
- Зарегистрировано в БД:
* vtiger_ws_operation (id: 51)
* vtiger_ws_operation_parameters (policy_number, contact_id, period_start, period_end)
- Логи: logs/CreateWebProject.log
- Протестировано: проект 396865 создан и повторно найден без дублирования
🔧 Исправления:
- Исправлены пути к папкам проектов: теперь /Documents/Project/{Name}_{Id}
- Исправлена функция openProjectFolder() во всех JS файлах
- Добавлены кнопки создания Word/Excel/PowerPoint из CRM (10 модулей)
- Создание файлов напрямую в S3 с автоиндексацией через Redis
- Исправлена ошибка 'Class Redis not found' (использован Predis)
📁 Изменённые файлы:
- layouts/v7/lib/nextcloud-editor.js
- crm_extensions/nextcloud_editor/js/nextcloud-editor.js
- layouts/v7/lib/nextcloud-editor-v3.js
- crm_extensions/file_storage/api/create_nextcloud_file.php
- layouts/v7/modules/*/DetailViewHeaderTitle.tpl (10 модулей)
- layouts/v7/modules/Documents/*.tpl (кнопки редактирования)
🎯 Результат:
- Кнопка 'Папка в Nextcloud' открывает правильную папку
- Создание файлов работает молниеносно (прямо в S3)
- Redis события публикуются корректно
- OnlyOffice открывается для редактирования
Проект 391552 теперь открывается по правильному пути!
- Добавлен s3Path в callbackUrl для сохранения в оригинальный файл
- Исправлено сохранение: теперь файлы обновляются в S3 автоматически
- Отключена проверка SSL в OnlyOffice (rejectUnauthorized: false)
- Разрешены callback на приватные IP адреса
- Добавлено логирование callback в onlyoffice_callback.log
- Восстановлены оптимальные настройки индексации Nextcloud
- filesystem_check_changes = 0 для S3 External Storage
- Redis event system работает для автоматической индексации
Документация:
- ИСПРАВЛЕНИЕ_СОХРАНЕНИЯ_ONLYOFFICE_01_11_2025.md
- ИСПРАВЛЕНИЕ_SSL_ONLYOFFICE_01_11_2025.md
- ВОССТАНОВЛЕНИЕ_ОПТИМИЗАЦИИ_01_11_2025.md
- ONLYOFFICE_НАСТРОЙКИ.md
- ТЕСТИРОВАНИЕ_СОХРАНЕНИЯ_ONLYOFFICE.md
✅ ЧТО СДЕЛАНО:
- Поднят новый standalone OnlyOffice Document Server (порт 8083)
- Настроен Nginx для доступа через office.clientright.ru:9443
- Создан open_file_v3_standalone.php для работы с новым OnlyOffice
- Реализована поддержка прямых S3 URL (bucket публичный)
- Добавлен s3_proxy.php с поддержкой Range requests
- Создан onlyoffice_callback.php для сохранения (базовая версия)
- Файлы успешно открываются и загружаются!
⚠️ TODO (на завтра):
- Доработать onlyoffice_callback.php для сохранения обратно в ОРИГИНАЛЬНЫЙ путь в S3
- Добавить Redis маппинг documentKey → S3 path
- Обновить CRM JS для использования open_file_v3_standalone.php
- Протестировать сохранение файлов
- Удалить тестовые файлы
📊 РЕЗУЛЬТАТ:
- OnlyOffice Standalone РАБОТАЕТ! ✅
- Файлы открываются напрямую из S3 ✅
- Редактор загружается БЫСТРО ✅
- Автосохранение настроено ✅ (но нужна доработка callback)
- Упрощённая операция создания контакта: обязательно только mobile
- Логика: если контакт существует - возвращает ID БЕЗ обновления
- Если не существует - создаёт с дефолтами (Клиент ERV_XXXX)
- Формат телефона: 79001234567 (без +)
- Зарегистрировано в БД:
* vtiger_ws_operation (id: 50)
* vtiger_ws_operation_parameters (mobile, firstname, lastname, email)
- Логи: logs/CreateWebContact.log
- Протестировано: контакт 396625 найден и возвращён без изменений
- Добавлен флаг JSON_UNESCAPED_UNICODE во все json_encode()
- Теперь русские символы в логах отображаются корректно, а не как \uXXXX
- Исправлено 5 мест: все ошибки и успешные ответы
- Увеличен таймаут cURL с 60 до 180 секунд (3 минуты)
- Добавлен таймаут соединения 30 секунд
- Детальное логирование ошибок cURL с кодами и описанием
- Добавлено логирование времени выполнения каждого этапа
- Добавлено логирование использования памяти
- Улучшена обработка ошибок JSON с выводом проблемных данных
- Добавлена статистика общего времени выполнения скрипта
✅ Что реализовано:
- SSL/HTTPS для Nextcloud (Let's Encrypt R13)
- Redis кэширование для производительности
- Collabora Online редактор документов
- WOPI allow list настроен (0.0.0.0/0)
- Динамическое получение fileId через WebDAV
- Поддержка файлов из S3 и локальных файлов
- Автоматическое извлечение имени файла из URL
- Промежуточная страница для обхода CSRF
🚀 Как работает:
1. JavaScript передает recordId и fileName
2. PHP получает fileId через WebDAV PROPFIND
3. PHP делает редирект на рабочий URL Nextcloud
4. Файл открывается в редакторе Collabora
📁 Файлы:
- layouts/v7/lib/nextcloud-editor.js - JavaScript интеграция
- crm_extensions/file_storage/api/open_file.php - PHP редирект
- modules/Documents/actions/NcPrepareEdit.php - API подготовка
- crm_extensions/docs/ - документация
🎯 Результат: Каждый документ в CRM открывает СВОЙ файл в Nextcloud редакторе!
Проблема: Редакторы документов (OnlyOffice, Collabora) не установлены в Nextcloud
Решение: Добавлены дополнительные варианты открытия файлов
Изменения:
- crm_extensions/nextcloud_editor/js/nextcloud-editor.js:
* Убран параметр editing=false для Files App
* Добавлены варианты: download_direct, view_only
* Улучшена логика fallback при ошибках
Добавлены тестовые страницы:
- test_nc_open.html - тест разных редакторов
- simple_test.html - простое модальное окно с вариантами
Варианты открытия:
1. Files App (показать файл в менеджере)
2. Прямое скачивание через WebDAV
3. Просмотр (если поддерживается браузером)
Теперь кнопка Nextcloud будет работать даже без установленных редакторов
Обновленные файлы:
- crm_extensions/nextcloud_editor/js/nextcloud-editor.js (5 путей)
- crm_extensions/file_storage/api/get_edit_urls.php (6 путей)
- modules/Documents/actions/NcPrepareEdit.php (2 пути)
- crm_extensions/file_storage/api/prepare_edit.php (1 путь)
- crm_extensions/file_storage/NextcloudClient.php (1 путь)
- data/CRMEntity.php (nc_path для новых файлов)
Все пути теперь используют /crm/ вместо /crm2/ для соответствия новому External Storage на office.clientright.ru
- Изменен active_folder с '/crm2/CRM_Active_Files/' на '/crm/CRM_Active_Files/'
- Причина: На новом Nextcloud (office.clientright.ru) S3 примонтирован как /crm (не /crm2)
- Папка /crm/CRM_Active_Files/ существует и содержит подпапки Documents и crm2
- Конфигурация соответствует реальной структуре External Storage
- Изменена логика проверки уведомлений: теперь проверяются ВСЕ уведомления (не только непрочитанные)
- Если уведомление прочитано - дубликат НЕ создаётся (ранее создавался)
- Добавлена проверка статуса уведомления перед обновлением
- Добавлены уведомления для RegionalCourtParser (ранее только для MoscowCourtParser)
- Создана документация DUPLICATE_PREVENTION_GUIDE.md с описанием 3 уровней защиты
Теперь система полностью защищена от дубликатов:
1. Уровень событий в таблице subject
2. Уровень уведомлений в vtiger_vdnotifierpro (с проверкой статуса)
3. Уровень календаря CRM
Для продакшена: НЕ передавать skip_duplicate_check=true (по умолчанию false)
- Добавлена поддержка project_id в parscourt.php для создания уведомлений
- Создана система парсеров судов (BaseCourtParser, MoscowCourtParser, RegionalCourtParser)
- Интегрирован Browserless для парсинга московских судов (mos-sud.ru, mos-gorsud.ru)
- Добавлены уведомления VDNotifierPro при обнаружении новых событий судов
- Создан ParseAndCreateEvent.php для интеграции с CRM workflow
- Создан CreateCourtEvent_v2.php для прямого создания событий в календаре CRM
- Поддержка проверки дубликатов событий (можно отключить для тестирования)
- Автоматическое определение типа суда и выбор подходящего парсера
Функции:
- Парсинг региональных судов (*.sudrf.ru) через HTML
- Парсинг московских судов через Browserless API
- Создание событий в CRM календаре с привязкой к проектам
- Уведомления ответственных пользователей о новых событиях
- Сохранение событий в таблицу subject для истории
- Создан файл STATUS_CHECKER_STATUS.md с текущим состоянием
- Описаны проблемы с API Debexpert
- Указаны планы на будущее
- Добавлены команды для управления cron
- Удалена cron задача из-за нестабильности API Debexpert
- Обновлена документация с информацией об отключении
- Скрипт остается доступен для ручного запуска
- Cron можно будет включить обратно после решения проблем с API
- Изменен канал комментариев на 'Telegram AI Bot' для отображения иконки робота 🤖
- Убран эмодзи из текста комментария для совместимости с БД
- Настроен cron для ежедневного запуска в 10:00
- Обновлена документация с информацией о cron и иконке
- Логи cron сохраняются в logs/auto_status_checker_cron.log
- Протестировано создание комментариев с иконкой робота
- Создан скрипт check_exec_list_statuses.php
- Находит проекты со статусами: заявление на лист, выдача листа, исполнительное производство
- Проверяет наличие регистрационного номера (cf_2429) и отсутствие номера листа (cf_1752)
- Запрашивает статус через GetCourtStatus.php API
- Создает комментарии в проектах от ИИ Клиентправ (ID 23)
- Комментарии содержат полную историю движения дела и список документов
- Обработка таймаутов и ошибок API
- Подробное логирование в logs/auto_status_checker.log
- Добавлена документация AUTO_STATUS_CHECKER_README.md
- Готов к запуску через cron для автоматической проверки
- API Debexpert периодически работает (успешный запрос 16.10.2025 18:59:04)
- Получены полные данные по делу 15RS0011-201-25-0000448
- Обновлена документация с результатами тестирования
- Отмечены ограничения: нестабильная работа API, частые таймауты
- Изменен timeout с 60 до 120 секунд в GetCourtStatus.php
- API Debexpert работает нестабильно, часто таймаутит
- Успешные запросы подтверждают, что endpoint работает корректно
- Увеличенный таймаут даст больше шансов получить ответ
- Реализована функция createTicketNotification() в HelpDeskHandler
- Автоматическое создание уведомлений при создании новой заявки
- Уведомления отправляются ответственному за заявку
- Умная дедупликация - обновление существующих непрочитанных уведомлений
- Формат заголовка: 'Новая заявка ЗАЯВКА_XXX - [название]'
- Ссылка ведет на заявку в CRM
- Протестировано и работает корректно
- Реализована функция createTelegramAINotification() в telegram_ai_qa.php
- Автоматическое создание уведомлений при общении клиента с AI ботом
- Уведомления отправляются ответственному по проекту
- Умная дедупликация - обновление существующих непрочитанных уведомлений
- Краткий заголовок с именем клиента и началом вопроса (до 80 символов)
- Ссылка ведет на проект с комментариями диалога
- Добавлена документация TELEGRAM_AI_NOTIFICATIONS.md
- Протестировано и работает корректно
- Реализована функция createMailNotification() в simple_project_updater_v2.php
- Автоматическое создание уведомлений VDNotifierPro при поступлении документов
- Уведомления отправляются ответственному по проекту
- Исправлен формат ссылок (без index.php? для корректной работы в VDNotifierPro)
- Защита от дубликатов - обновление существующих непрочитанных уведомлений
- Добавлена документация MAIL_NOTIFICATION_SYSTEM.md
- Протестировано и работает корректно
- court_document_parser.py: парсер судебных документов с извлечением ФИО, номера дела, УИД, суда
- court_parser_api.py: API для вызова парсера из n8n
- pdf_court_parser.py: парсер PDF документов с извлечением текста
- simple_project_updater.php: обновление проектов через CRM API
- simple_project_updater_v2.php: обновленная версия с прямыми SQL запросами и S3Client
- update_project_from_document.php: альтернативный скрипт обновления
- test_input.json: тестовые данные для парсера
- README файлы с документацией для всех скриптов
Скрипты поддерживают:
- Поиск проектов по ФИО, номеру дела, УИД, названию суда
- Создание документов в CRM с загрузкой в S3
- Привязку документов к проектам
- Логирование всех операций
- Работу с n8n через SSH команды