Files
crm.clientright.ru/SESSION_LOG_ARCHIVE_FIX.md
Fedor d3ba054027 Исправление архивации проектов: поддержка S3 файлов и документов из связанных сущностей
- Добавлен метод getRelatedDocs() для получения документов из связанных сущностей (контакты, контрагенты)
- Добавлен метод downloadS3File() для скачивания файлов из S3 во временную папку
- Добавлен метод cleanupTempFiles() для очистки временных файлов
- Исправлен getPaths() для корректной обработки S3 файлов (всегда запрашивает s3_bucket/s3_key из БД)
- Исправлен getArchive() для проектов: собирает документы из основной записи и связанных сущностей
- Исправлен путь к vendor/autoload.php (поиск по нескольким путям)
- Исправлено имя временного файла (короткое имя вместо полного пути для избежания 'File name too long')

Результат: архив успешно создается с документами из проекта и связанных сущностей (25 документов для проекта 396447)
2025-11-21 10:23:52 +03:00

108 lines
6.8 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.

# Лог сессии: Исправление архивации проектов с 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 с описанием исправлений.