Files
crm.clientright.ru/crm_extensions/file_storage/move_projects_to_folder.php
Fedor 9245768987 🚀 CRM Files Migration & Real-time Features
 Features:
- Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.)
- Added Nextcloud folder buttons to ALL modules
- Fixed Nextcloud editor integration
- WebSocket server for real-time updates
- Redis Pub/Sub integration
- File path manager for organized storage
- Redis caching for performance (Functions.php)

📁 New Structure:
Documents/Project/ProjectName_ID/file_docID.ext
Documents/Contacts/FirstName_LastName_ID/file_docID.ext
Documents/Accounts/AccountName_ID/file_docID.ext

🔧 Technical:
- FilePathManager for standardized paths
- S3StorageService integration
- WebSocket server (Node.js + Docker)
- Redis cache for getBasicModuleInfo()
- Predis library for Redis connectivity

📝 Scripts:
- Migration scripts for all modules
- Test pages for WebSocket/SSE/Polling
- Documentation (MIGRATION_*.md, REDIS_*.md)

🎯 Result: 15,000+ files migrated successfully!
2025-10-24 19:59:28 +03:00

147 lines
5.1 KiB
PHP
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.

<?php
/**
* Скрипт переноса Project файлов в папку Project/
*
* Было: Название_проекта_123/document_456.pdf
* Станет: Project/Название_проекта_123/document_456.pdf
*/
require_once(__DIR__ . '/../../config.inc.php');
require_once(__DIR__ . '/../../include/utils/utils.php');
require_once(__DIR__ . '/../../include/utils/CommonUtils.php');
require_once(__DIR__ . '/S3Client.php');
require_once(__DIR__ . '/FilePathManager.php');
global $adb;
echo "🔄 ПЕРЕНОС PROJECT ФАЙЛОВ В ПАПКУ Project/\n";
echo "==========================================\n\n";
// Инициализация S3
$s3Client = new S3Client();
$pathManager = new FilePathManager();
// Получаем все файлы Project в старой структуре (2 части пути)
$sql = "SELECT n.notesid, n.filename, n.title,
p.projectid, c.projectname
FROM vtiger_notes n
INNER JOIN vtiger_senotesrel sr ON n.notesid = sr.notesid
INNER JOIN vtiger_project p ON sr.crmid = p.projectid
INNER JOIN vtiger_crmentity c ON p.projectid = c.crmid
WHERE n.deleted = 0
AND c.deleted = 0
AND n.filelocationtype = 'S'
AND n.filename LIKE '%/%'
AND n.filename NOT LIKE 'Project/%'
ORDER BY p.projectid";
$result = $adb->query($sql);
$totalFiles = $adb->num_rows($result);
echo "📊 Найдено файлов для переноса: $totalFiles\n\n";
if ($totalFiles == 0) {
echo "Все файлы уже в правильной структуре!\n";
exit(0);
}
// Статистика
$stats = [
'processed' => 0,
'moved' => 0,
'updated' => 0,
'errors' => 0,
'skipped' => 0
];
// Обрабатываем каждый файл
while ($row = $adb->fetch_array($result)) {
$stats['processed']++;
$notesId = $row['notesid'];
$oldFilename = $row['filename'];
$projectId = $row['projectid'];
$projectName = $row['projectname'];
echo "[$stats[processed]/$totalFiles] Проект: $projectName (ID: $projectId)\n";
echo " Старый путь: $oldFilename\n";
// Формируем новый путь
$newFilename = "Project/" . $oldFilename;
echo " Новый путь: $newFilename\n";
// Формируем S3 ключи
$oldS3Key = "crm2/CRM_Active_Files/Documents/" . urldecode($oldFilename);
$newS3Key = "crm2/CRM_Active_Files/Documents/" . $newFilename;
try {
// Проверяем существование исходного файла
if (!$s3Client->exists($oldS3Key)) {
echo " ⚠️ Исходный файл не найден в S3: $oldS3Key\n";
$stats['skipped']++;
continue;
}
// Проверяем, не существует ли уже новый файл
if ($s3Client->exists($newS3Key)) {
echo " ⚠️ Целевой файл уже существует: $newS3Key\n";
// Обновляем только БД
$updateSql = "UPDATE vtiger_notes SET filename = ? WHERE notesid = ?";
$adb->pquery($updateSql, [$newFilename, $notesId]);
$stats['updated']++;
echo " ✅ БД обновлена\n\n";
continue;
}
// Копируем файл в новое место
if ($s3Client->copy($oldS3Key, $newS3Key)) {
echo " ✅ Файл скопирован в S3\n";
// Удаляем старый файл
$s3Client->delete($oldS3Key);
echo " ✅ Старый файл удален\n";
// Обновляем путь в базе данных
$updateSql = "UPDATE vtiger_notes SET filename = ? WHERE notesid = ?";
$adb->pquery($updateSql, [$newFilename, $notesId]);
echo " ✅ БД обновлена\n";
$stats['moved']++;
echo " ✅ УСПЕШНО!\n\n";
} else {
throw new Exception("Failed to copy file in S3");
}
} catch (Exception $e) {
echo " ❌ ОШИБКА: " . $e->getMessage() . "\n\n";
$stats['errors']++;
}
// Небольшая пауза чтобы не нагружать S3
usleep(100000); // 0.1 сек
}
// Итоговая статистика
echo "\n";
echo "==========================================\n";
echo "📊 ИТОГОВАЯ СТАТИСТИКА:\n";
echo "==========================================\n";
echo "Обработано: $stats[processed]\n";
echo "Перенесено: $stats[moved]\n";
echo "Обновлено БД: $stats[updated]\n";
echo "Пропущено: $stats[skipped]\n";
echo "Ошибок: $stats[errors]\n";
echo "\n";
if ($stats['errors'] == 0 && $stats['moved'] + $stats['updated'] == $totalFiles) {
echo "ВСЕ ФАЙЛЫ УСПЕШНО ПЕРЕНЕСЕНЫ В ПАПКУ Project/!\n";
} else {
echo "⚠️ Есть ошибки или пропущенные файлы. Проверьте логи.\n";
}
?>