🚀 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!
This commit is contained in:
146
crm_extensions/file_storage/fix_accounts_paths.php
Normal file
146
crm_extensions/file_storage/fix_accounts_paths.php
Normal file
@@ -0,0 +1,146 @@
|
||||
<?php
|
||||
/**
|
||||
* Исправление путей файлов контрагентов
|
||||
* Обновляет пути с account_ID_ID на правильное имя контрагента
|
||||
*/
|
||||
|
||||
// Подключаем необходимые файлы
|
||||
require_once '/var/www/fastuser/data/www/crm.clientright.ru/config.inc.php';
|
||||
require_once '/var/www/fastuser/data/www/crm.clientright.ru/include/database/PearDatabase.php';
|
||||
|
||||
echo "🚀 Начинаем исправление путей файлов контрагентов...\n\n";
|
||||
mb_internal_encoding('UTF-8');
|
||||
|
||||
try {
|
||||
// Подключаемся к базе данных
|
||||
$pdo = new PDO("mysql:host={$dbconfig['db_server']};dbname={$dbconfig['db_name']};charset=utf8", $dbconfig['db_username'], $dbconfig['db_password']);
|
||||
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||
echo "✅ Подключение к БД установлено\n\n";
|
||||
|
||||
// Находим все файлы контрагентов с неправильными путями
|
||||
$sql = "
|
||||
SELECT
|
||||
n.notesid,
|
||||
n.title,
|
||||
n.filename,
|
||||
n.s3_key,
|
||||
a.accountid,
|
||||
a.accountname
|
||||
FROM vtiger_notes n
|
||||
INNER JOIN vtiger_senotesrel sr ON n.notesid = sr.notesid
|
||||
INNER JOIN vtiger_account a ON sr.crmid = a.accountid
|
||||
WHERE n.filelocationtype = 'E'
|
||||
AND n.s3_key IS NOT NULL
|
||||
AND n.s3_key LIKE '%/Accounts/account_%'
|
||||
ORDER BY a.accountid, n.notesid
|
||||
";
|
||||
|
||||
$stmt = $pdo->prepare($sql);
|
||||
$stmt->execute();
|
||||
$files = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
echo "📊 Найдено файлов контрагентов для исправления: " . count($files) . "\n\n";
|
||||
|
||||
if (empty($files)) {
|
||||
echo "✅ Все файлы контрагентов уже исправлены!\n";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
$updatedCount = 0;
|
||||
$errorCount = 0;
|
||||
$currentAccountId = null;
|
||||
$accountCount = 0;
|
||||
|
||||
foreach ($files as $file) {
|
||||
$notesId = $file['notesid'];
|
||||
$title = $file['title'];
|
||||
$oldS3Key = $file['s3_key'];
|
||||
$accountId = $file['accountid'];
|
||||
$accountName = $file['accountname'];
|
||||
|
||||
// Считаем контрагентов
|
||||
if ($currentAccountId !== $accountId) {
|
||||
$currentAccountId = $accountId;
|
||||
$accountCount++;
|
||||
}
|
||||
|
||||
echo "📁 Контрагент: {$accountName} (ID: {$accountId})\n";
|
||||
echo " 📄 Файл: {$title} (ID: {$notesId})\n";
|
||||
echo " 🔄 Старый путь: {$oldS3Key}\n";
|
||||
|
||||
try {
|
||||
// Правильная нормализация имени контрагента (сохраняем кириллицу!)
|
||||
$normalizedName = preg_replace('/[\/\\:*?"<>|№]/u', '_', $accountName);
|
||||
$normalizedName = preg_replace('/\s+/', '_', trim($normalizedName));
|
||||
$normalizedName = preg_replace('/_+/', '_', $normalizedName);
|
||||
$normalizedName = trim($normalizedName, '_');
|
||||
|
||||
if (empty($normalizedName)) {
|
||||
$normalizedName = "account_{$accountId}";
|
||||
}
|
||||
|
||||
// Правильная нормализация имени файла (сохраняем кириллицу!)
|
||||
$normalizedTitle = preg_replace('/[\/\\:*?"<>|№]/u', '_', $title);
|
||||
$normalizedTitle = preg_replace('/\s+/', '_', trim($normalizedTitle));
|
||||
$normalizedTitle = preg_replace('/_+/', '_', $normalizedTitle);
|
||||
$normalizedTitle = trim($normalizedTitle, '_');
|
||||
|
||||
if (empty($normalizedTitle)) {
|
||||
$normalizedTitle = "file_{$notesId}";
|
||||
}
|
||||
|
||||
// Получаем расширение файла
|
||||
$extension = pathinfo($normalizedTitle, PATHINFO_EXTENSION);
|
||||
if (empty($extension)) {
|
||||
// Пробуем извлечь расширение из старого пути
|
||||
$extension = pathinfo($oldS3Key, PATHINFO_EXTENSION);
|
||||
if (empty($extension)) {
|
||||
$extension = 'pdf';
|
||||
}
|
||||
}
|
||||
|
||||
// Формируем новый правильный путь
|
||||
$newS3Key = "crm2/CRM_Active_Files/Documents/Accounts/{$normalizedName}_{$accountId}/{$normalizedTitle}_{$notesId}.{$extension}";
|
||||
$newFilename = "https://s3.twcstorage.ru/f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c/{$newS3Key}";
|
||||
|
||||
echo " ✅ Новый путь: {$newS3Key}\n";
|
||||
|
||||
// Обновляем записи в БД (БЕЗ копирования в S3, только БД!)
|
||||
$updateSql = "
|
||||
UPDATE vtiger_notes
|
||||
SET s3_key = ?, filename = ?
|
||||
WHERE notesid = ?
|
||||
";
|
||||
|
||||
$updateStmt = $pdo->prepare($updateSql);
|
||||
$updateStmt->execute([$newS3Key, $newFilename, $notesId]);
|
||||
|
||||
echo " ✅ Записи в БД обновлены\n";
|
||||
$updatedCount++;
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo " ❌ Ошибка: " . $e->getMessage() . "\n";
|
||||
$errorCount++;
|
||||
}
|
||||
|
||||
echo "\n";
|
||||
}
|
||||
|
||||
echo "🎉 ИСПРАВЛЕНИЕ ЗАВЕРШЕНО!\n";
|
||||
echo "📊 Статистика:\n";
|
||||
echo " • Контрагентов обработано: {$accountCount}\n";
|
||||
echo " • Записей обновлено: {$updatedCount}\n";
|
||||
echo " • Ошибок: {$errorCount}\n";
|
||||
echo " • Всего файлов: " . count($files) . "\n";
|
||||
|
||||
if ($errorCount > 0) {
|
||||
echo "\n⚠️ Некоторые записи не удалось обновить.\n";
|
||||
}
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "❌ КРИТИЧЕСКАЯ ОШИБКА: " . $e->getMessage() . "\n";
|
||||
echo "Стек вызовов:\n" . $e->getTraceAsString() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user