- Добавлена проверка наличия черновика в БД перед запуском RAG
- Если documents_hash совпадает — возвращаем черновик из кэша
- Если черновика нет или он устарел — запускаем RAG workflow
- Добавлен параметр force_refresh для принудительного обновления
- Импортирован db сервис для работы с PostgreSQL
- Обновлён Code1: нормализация данных из give_data1 с поддержкой payload.applicant, ai_analysis, wizard_plan
- Обновлён Code6: генерация промптов для RAG (user, project, offenders)
- Добавлена документация по настройке n8n нод для OCR статуса
- Добавлен эндпоинт check-ocr-status в documents.py
- Добавлен лог сессии с полным описанием workflow
Workflow itX62h38faB51y9J успешно извлекает:
- Данные пользователя (ФИО, контакты, адрес)
- Данные проекта (сумма, предмет, даты договора)
- Несколько контрагентов с разными ролями (seller, service_provider)
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp]
- Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta
- Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов
- Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
- Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений
Fixes:
- field_label теперь корректно отображает 'Переписка' вместо 'group-2'
- documents_meta не накапливает дубликаты при повторных сохранениях
- ON CONFLICT (file_hash) теперь работает для document_texts
- StepDocumentsNew.tsx: поэкранная загрузка документов
- StepWaitingClaim.tsx: ожидание формирования заявления с SSE
- StepDraftSelection.tsx: поддержка новых статусов черновиков
- documents.py: API для загрузки документов
- NEW_FLOW_ARCHITECTURE.md: документация новой архитектуры
Флоу: Description → Documents → Waiting → Claim Review → SMS
Статусы: draft_new, draft_docs_progress, draft_docs_complete, draft_claim_ready
- Добавлены unified_id и contact_id в TicketFormDescriptionRequest
- Исправлен CODE_MERGE_PROJECT_TO_SESSION.js - теперь сохраняются ВСЕ данные из body.other
- Добавлен fallback на получение other из Webhook напрямую
- Генерация новой session_id при создании новой жалобы (сохраняя авторизацию)
- Добавлен SQL_SELECT_CONTACT_WITH_CUSTOM_FIELDS.sql для CRM контактов
- Создан SESSION_LOG_2025-11-25.md с документацией сессии
- Добавлен метод getRelatedDocs() для получения документов из связанных сущностей (контакты, контрагенты)
- Добавлен метод downloadS3File() для скачивания файлов из S3 во временную папку
- Добавлен метод cleanupTempFiles() для очистки временных файлов
- Исправлен getPaths() для корректной обработки S3 файлов (всегда запрашивает s3_bucket/s3_key из БД)
- Исправлен getArchive() для проектов: собирает документы из основной записи и связанных сущностей
- Исправлен путь к vendor/autoload.php (поиск по нескольким путям)
- Исправлено имя временного файла (короткое имя вместо полного пути для избежания 'File name too long')
Результат: архив успешно создается с документами из проекта и связанных сущностей (25 документов для проекта 396447)
- Убрана проверка claim_id из StepDescription.tsx
- Заменен claim_id на session_id в StepWizardPlan.tsx для SSE подключения
- Убран claim_id из запросов к API и сохранения в Step1Phone
- Обновлен backend для работы с опциональным claim_id
- Добавлена документация по исправлению узла claimsave для первичного черновика
- Добавлены SQL запросы и примеры кода для n8n workflow
- Исправлена ошибка ReferenceError при загрузке черновиков
- Переименована локальная переменная claimId в finalClaimId для избежания конфликта с параметром функции
- Обновлена логика извлечения claim_id из разных источников (claim.claim_id, payload.claim_id, body.claim_id, claim.id)
- Добавлен fallback на параметр claimId функции для надёжности
- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI
- Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код)
- Установлен PHPWord для красивого форматирования документов
- Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале)
- Замена пробелов на подчеркивания в именах папок
- Создана документация для AI и разработчиков
- Добавлены API для работы с шаблонами Nextcloud
- Добавлен resize handle (полоска для перетаскивания) слева от drawer
- Реализовано изменение ширины перетаскиванием (от 300px до 50% экрана)
- Сохранение ширины в localStorage
- Автоматическое обновление margin для main-container
- Обработка изменения размера окна браузера
- Скрытие resize handle на мобильных устройствах
- Добавлен 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 с выводом проблемных данных
- Добавлена статистика общего времени выполнения скрипта