Files
crm.clientright.ru/crm_extensions/file_storage/move_projects_to_folder.php

147 lines
5.1 KiB
PHP
Raw Normal View History

<?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";
}
?>