Files
crm.clientright.ru/SESSION_LOG_ARCHIVE_FIX.md
Fedor 840acca51a feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен 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
2025-11-28 18:16:53 +03:00

6.8 KiB
Raw Blame History

Лог сессии: Исправление архивации проектов с S3 файлами

Дата: 2025-11-21

Проблема

Архивация проектов не работала после миграции на S3:

  • Возвращался ответ {"success":true,"result":"Nothing to archive"}
  • Затем появились ошибки "_ is missing!" для всех документов
  • После исправления появились ошибки "S3 file download failed" для всех файлов

Причины проблем

1. Неправильная обработка S3 файлов

  • Метод getPaths() пытался обработать S3 файлы как локальные
  • Vtiger_Record_Model не всегда содержит поля s3_bucket, s3_key, filelocationtype
  • Нужно было явно запрашивать эти данные из БД

2. Отсутствие поддержки связанных документов

  • Архив включал только документы самого проекта
  • Не включались документы из связанных сущностей (контакты, контрагенты)
  • Аналогично функционалу отправки исковых писем через pochta-sud.ru

3. Ошибки при скачивании из S3

  • Неправильный путь к vendor/autoload.php (относительный путь не работал)
  • Слишком длинное имя временного файла (File name too long)
  • Использовался basename($fileName) где $fileName содержал URL-encoded полный путь

Решение

1. Добавлен метод getRelatedDocs($projectId)

  • Получает документы из связанных сущностей проекта:
    • Контакт (linktoaccountscontacts)
    • Контрагенты (cf_1994, cf_2274, cf_2276)
  • Возвращает массив документов с полями: notesid, title, filename, filelocationtype, s3_bucket, s3_key

2. Добавлен метод downloadS3File($s3Bucket, $s3Key, $fileName)

  • Скачивает файлы из S3 во временную папку
  • Использует AWS SDK для работы с S3
  • Сохраняет пути временных файлов для последующей очистки
  • Обрабатывает ошибки с подробным логированием

3. Добавлен метод cleanupTempFiles()

  • Очищает все временные файлы после создания архива
  • Вызывается в finally блоке для гарантированной очистки

4. Исправлен метод getPaths($docs)

  • Поддержка как Vtiger_Record_Model объектов, так и массивов из getRelatedDocs
  • ВСЕГДА запрашивает s3_bucket, s3_key, filelocationtype из БД для Record Models
  • Правильно определяет S3 файлы (filelocationtype == 'E' && !empty($s3Bucket) && !empty($s3Key))
  • Для S3 файлов вызывает downloadS3File()
  • Для локальных файлов использует getFileDetails()

5. Исправлен метод getArchive($id)

  • Для проектов собирает документы из основной записи и связанных сущностей
  • Предотвращает дубликаты документов
  • Вызывает getPaths() с объединенным списком документов
  • Добавлено подробное логирование для отладки
  • Обработка ошибок с возвратом детальной информации

6. Исправления в downloadS3File()

  • Поиск vendor/autoload.php по нескольким путям (относительный и абсолютный)
  • Использование короткого имени временного файла (только расширение, без полного пути)
  • Подробное логирование в /tmp/s3_download_debug.log

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

modules/Vtiger/services/Base.php

  • Добавлен метод getRelatedDocs($projectId) - получение документов из связанных сущностей
  • Добавлен метод downloadS3File($s3Bucket, $s3Key, $fileName) - скачивание из S3
  • Добавлен метод cleanupTempFiles() - очистка временных файлов
  • Добавлено свойство private static $tempFiles = [] - хранение путей временных файлов
  • Исправлен метод getPaths($docs) - поддержка S3 и связанных документов
  • Исправлен метод getArchive($id) - сбор документов из связанных сущностей для проектов

Тестирование

Тестовый скрипт test_s3_download.php

  • Создан для прямого тестирования downloadS3File()
  • Успешно скачал файл из S3 (9.5 МБ)
  • Подтвердил работоспособность исправлений

Результат

  • Архив успешно создается с 25 документами для проекта 396447
  • Включаются документы из проекта и связанных сущностей
  • S3 файлы корректно скачиваются и добавляются в архив
  • Временные файлы автоматически очищаются

Технические детали

S3 конфигурация

  • Используется конфиг из crm_extensions/file_storage/config.php
  • Endpoint: https://s3.twcstorage.ru
  • Bucket и Key берутся из полей vtiger_notes.s3_bucket и vtiger_notes.s3_key

Временные файлы

  • Сохраняются в sys_get_temp_dir() (обычно /tmp)
  • Имена: s3_{uniqid}.{extension}
  • Автоматически удаляются после создания архива

Логирование

  • Основные логи: error_log() (системный лог PHP)
  • Отладочные логи: /tmp/s3_download_debug.log (временный, удален после исправления)
  • Ошибки: /tmp/s3_download_errors.log (временный, удален после исправления)

Коммит

Изменения закоммичены в git с описанием исправлений.