правильный путь $filesToMove = [ 398030 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398030/8_Договор_на_оказание_услуг_11-14-2025-16-00-51_Храмов_1_CTP#realfile.pdf', 'new' => $projectPrefix . '8_Договор_на_оказание_услуг_398030.pdf', ], 398032 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398032/9_Подтверждение_оплаты_по_договору_11-14-2025-16-00-03_Храмов_1_CTP#realfile.pdf', 'new' => $projectPrefix . '9_Подтверждение_оплаты_по_договору_398032.pdf', ], 398034 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398034/10_2_Скрин_личного_кабинета_Истца_и_программа_обучения_11-14-2025-15-47-26_Храмов_41_CTP#realfile.pdf', 'new' => $projectPrefix . '10_2_Скрин_личного_кабинета_Истца_и_программа_обучения_398034.pdf', ], 398036 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398036/10_1_Скрин_личного_кабинета_Истца_и_программа_обучения_11-14-2025-15-49-59_Храмов_1_CTP#realfile.pdf', 'new' => $projectPrefix . '10_1_Скрин_личного_кабинета_Истца_и_программа_обучения_398036.pdf', ], 398038 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398038/Прочие_документы_11-14-2025-16-06-07_Храмов_3_CTP#realfile.pdf', 'new' => $projectPrefix . 'Прочие_документы_398038.pdf', ], 398040 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398040/7_zayavlenie_potrebitelya_Hramov.pdf', 'new' => $projectPrefix . '7_заявление_потребителя_398040.pdf', ], 398063 => [ 'old' => 'crm2/CRM_Active_Files/Documents/398063/napravleniya_pretenzii.pdf', 'new' => $projectPrefix . 'Направление_претензии_398063.pdf', ], 399067 => [ 'old' => 'clientright/0/1763997676315.pdf', 'new' => $projectPrefix . 'Документ_399067.pdf', ], 399068 => [ 'old' => 'clientright/0/1763997790309.pdf', 'new' => $projectPrefix . 'Документ_399068.pdf', ], ]; echo "=== ПЕРЕМЕЩЕНИЕ ФАЙЛОВ ПРОЕКТА {$projectId} ===\n"; echo str_repeat("=", 80) . "\n\n"; $dryRun = isset($argv[1]) && $argv[1] === '--dry-run'; if ($dryRun) { echo "⚠️ РЕЖИМ ПРОВЕРКИ (dry-run)\n\n"; } try { $s3Client = new \Aws\S3\S3Client([ 'version' => 'latest', 'region' => $config['s3']['region'], 'endpoint' => $config['s3']['endpoint'], 'use_path_style_endpoint' => true, 'credentials' => [ 'key' => $config['s3']['key'], 'secret' => $config['s3']['secret'], ], 'suppress_php_deprecation_warning' => true ]); $stats = [ 'total' => count($filesToMove), 'moved' => 0, 'skipped' => 0, 'failed' => 0, ]; foreach ($filesToMove as $docId => $paths) { $oldPath = $paths['old']; $newPath = $paths['new']; $filename = basename($newPath); echo "Документ ID: {$docId}\n"; echo " Файл: {$filename}\n"; echo " От: {$oldPath}\n"; echo " К: {$newPath}\n"; // Проверяем существование старого файла if (!$s3Client->doesObjectExist($s3Bucket, $oldPath)) { echo " ⚠️ Старый файл не найден\n\n"; $stats['skipped']++; continue; } // Проверяем, не существует ли уже новый файл if ($s3Client->doesObjectExist($s3Bucket, $newPath)) { echo " ⚠️ Новый файл уже существует\n\n"; $stats['skipped']++; continue; } if (!$dryRun) { try { // Копируем файл $s3Client->copyObject([ 'Bucket' => $s3Bucket, 'Key' => $newPath, 'CopySource' => "{$s3Bucket}/{$oldPath}", ]); echo " ✅ Скопирован\n"; // Удаляем старый $s3Client->deleteObject([ 'Bucket' => $s3Bucket, 'Key' => $oldPath, ]); echo " ✅ Старый удален\n"; $stats['moved']++; sleep(1); } catch (Exception $e) { echo " ❌ Ошибка: " . $e->getMessage() . "\n"; $stats['failed']++; } } else { echo " ⏸️ Будет перемещен (dry-run)\n"; $stats['moved']++; } echo "\n"; } // Итоги echo str_repeat("=", 80) . "\n"; echo "ИТОГИ:\n"; echo "Всего файлов: {$stats['total']}\n"; if (!$dryRun) { echo "Перемещено: {$stats['moved']}\n"; echo "Пропущено: {$stats['skipped']}\n"; echo "Ошибок: {$stats['failed']}\n"; if ($stats['moved'] > 0) { echo "\n⚠️ ВАЖНО: Обновите БД с правильными путями!\n"; } } else { echo "Будет перемещено: {$stats['moved']}\n"; } echo "\n=== ГОТОВО ===\n"; } catch (Exception $e) { echo "❌ Критическая ошибка: " . $e->getMessage() . "\n"; exit(1); }