connect_error) { throw new Exception('Ошибка подключения к БД: ' . $mysqli->connect_error); } $mysqli->set_charset('utf8'); // Поиск проекта $plaintiff_fio = $content['plaintiff_fio'] ?? ''; $case_number = $content['case_number'] ?? ''; $uid = $content['uid'] ?? ''; $project_id = null; // Поиск по ФИО if ($plaintiff_fio) { // Извлекаем фамилию из полного ФИО $surname = explode(' ', $plaintiff_fio)[0]; $stmt = $mysqli->prepare(" SELECT p.projectid, p.projectname, p.project_no, e.description FROM vtiger_project p JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0 WHERE (p.projectname LIKE ? OR e.description LIKE ? OR p.projectname LIKE ? OR e.description LIKE ?) LIMIT 1 "); $search_term_full = "%$plaintiff_fio%"; $search_term_surname = "%$surname%"; $stmt->bind_param('ssss', $search_term_full, $search_term_full, $search_term_surname, $search_term_surname); $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { $project_id = $row['projectid']; } $stmt->close(); } // Поиск по номеру дела if (!$project_id && $case_number) { $stmt = $mysqli->prepare(" SELECT p.projectid, p.projectname, p.project_no, e.description FROM vtiger_project p JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0 WHERE (p.project_no LIKE ? OR e.description LIKE ?) LIMIT 1 "); $search_term = "%$case_number%"; $stmt->bind_param('ss', $search_term, $search_term); $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { $project_id = $row['projectid']; } $stmt->close(); } // Поиск по УИД if (!$project_id && $uid) { $stmt = $mysqli->prepare(" SELECT p.projectid, p.projectname, p.project_no, e.description FROM vtiger_project p JOIN vtiger_crmentity e ON e.crmid = p.projectid AND e.deleted = 0 WHERE e.description LIKE ? LIMIT 1 "); $search_term = "%$uid%"; $stmt->bind_param('s', $search_term); $stmt->execute(); $result = $stmt->get_result(); if ($row = $result->fetch_assoc()) { $project_id = $row['projectid']; } $stmt->close(); } if (!$project_id) { throw new Exception('Проект не найден по указанным данным'); } // Создаем документ в CRM $document_id = null; if (!empty($file_url) && !empty($file_name)) { // Скачиваем файл $file_content = file_get_contents($file_url); if ($file_content === false) { throw new Exception('Не удалось скачать файл: ' . $file_url); } // Формируем название документа $document_title = "СУДЕБНЫЙ ДОКУМЕНТ"; if (!empty($content['document_title'])) { $document_title = $content['document_title']; } if (!empty($content['case_number'])) { $document_title .= " по делу " . $content['case_number']; } if (!empty($content['plaintiff_fio'])) { $document_title .= " " . $content['plaintiff_fio']; } $document_title .= " " . date('d.m.Y'); // Получаем следующий ID для документа $stmt = $mysqli->prepare("SELECT MAX(crmid) + 1 as next_id FROM vtiger_crmentity"); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $document_id = $row['next_id']; $stmt->close(); // Обновляем vtiger_crmentity_seq чтобы избежать конфликтов ID $stmt = $mysqli->prepare("UPDATE vtiger_crmentity_seq SET id = ?"); $stmt->bind_param('i', $document_id); $stmt->execute(); $stmt->close(); // Создаем запись документа $stmt = $mysqli->prepare(" INSERT INTO vtiger_crmentity (crmid, smcreatorid, smownerid, modifiedby, setype, description, createdtime, modifiedtime, viewedtime, status, version, presence, deleted, smgroupid, source, label) VALUES (?, 1, 8, 1, 'Documents', ?, NOW(), NOW(), NULL, NULL, 0, 1, 0, 0, 'CRM', ?) "); $stmt->bind_param('iss', $document_id, $document_title, $document_title); $stmt->execute(); $stmt->close(); // Создаем запись в vtiger_notes $stmt = $mysqli->prepare(" INSERT INTO vtiger_notes (notesid, note_no, title, filename, notecontent, folderid, filetype, filelocationtype, filedownloadcount, filestatus, filesize, fileversion, tags, its4you_company, s3_bucket, s3_key, s3_etag, nc_path) VALUES (?, ?, ?, ?, ?, 3, 'application/pdf', 'E', 0, 1, ?, '', '', '', '', '', '', '') "); $file_size = strlen($file_content); $note_no = "ДОК_" . $document_id; $stmt->bind_param('issssi', $document_id, $note_no, $document_title, $file_name, $document_title, $file_size); $stmt->execute(); $stmt->close(); // Связываем документ с проектом $stmt = $mysqli->prepare(" INSERT INTO vtiger_senotesrel (crmid, notesid) VALUES (?, ?) "); $stmt->bind_param('ii', $project_id, $document_id); $stmt->execute(); $stmt->close(); // Сохраняем файл в S3 $s3_bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c'; $s3_key = 'crm2/CRM_Active_Files/Documents/' . $document_id . '/' . $file_name; // Генерируем ETag для S3 $s3_etag = '"' . md5($file_content) . '"'; // Обновляем запись в vtiger_notes с S3 информацией $stmt = $mysqli->prepare(" UPDATE vtiger_notes SET s3_bucket = ?, s3_key = ?, s3_etag = ?, nc_path = ? WHERE notesid = ? "); $stmt->bind_param('ssssi', $s3_bucket, $s3_key, $s3_etag, $s3_key, $document_id); $stmt->execute(); $stmt->close(); // Загружаем файл в S3 $s3_url = "https://s3.twcstorage.ru/$s3_bucket/$s3_key"; // Используем curl для загрузки в S3 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $s3_url); curl_setopt($ch, CURLOPT_PUT, true); curl_setopt($ch, CURLOPT_INFILE, fopen('data://text/plain;base64,' . base64_encode($file_content), 'r')); curl_setopt($ch, CURLOPT_INFILESIZE, strlen($file_content)); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/pdf', 'Content-Length: ' . strlen($file_content) ]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($http_code !== 200 && $http_code !== 201) { // Логируем ошибку, но не прерываем выполнение error_log("Ошибка загрузки в S3: HTTP $http_code, Response: $response"); } } // Обновляем статус проекта если нужно $stmt = $mysqli->prepare(" SELECT projectstatus FROM vtiger_project WHERE projectid = ? "); $stmt->bind_param('i', $project_id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); $current_status = $row['projectstatus'] ?? ''; $stmt->close(); if ($current_status === 'представительство в суде 1й инстанции') { $new_status = 'получено определение суда'; $stmt = $mysqli->prepare(" UPDATE vtiger_project SET projectstatus = ? WHERE projectid = ? "); $stmt->bind_param('si', $new_status, $project_id); $stmt->execute(); $stmt->close(); } // Логируем действие $log_file = __DIR__ . '/logs/project_update.log'; $log_dir = dirname($log_file); if (!is_dir($log_dir)) { mkdir($log_dir, 0755, true); } $log_entry = date('Y-m-d H:i:s') . " - PROJECT_UPDATE_SUCCESS: " . json_encode([ 'project_id' => $project_id, 'plaintiff_fio' => $plaintiff_fio, 'case_number' => $case_number, 'uid' => $uid ], JSON_UNESCAPED_UNICODE) . "\n"; file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); $mysqli->close(); // Формируем результат $result = [ 'success' => true, 'project_id' => $project_id, 'plaintiff_fio' => $plaintiff_fio, 'case_number' => $case_number, 'uid' => $uid, 'document_id' => $document_id, 'message' => 'Документ успешно добавлен к проекту' ]; echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); return 0; } catch (Exception $e) { $error_result = [ 'success' => false, 'error' => $e->getMessage(), 'timestamp' => date('Y-m-d H:i:s') ]; // Логируем ошибку $log_file = __DIR__ . '/logs/project_update.log'; $log_dir = dirname($log_file); if (!is_dir($log_dir)) { mkdir($log_dir, 0755, true); } $log_entry = date('Y-m-d H:i:s') . " - PROJECT_UPDATE_ERROR: " . json_encode($error_result, JSON_UNESCAPED_UNICODE) . "\n"; file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); echo json_encode($error_result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); return 1; } } // Запускаем скрипт if (php_sapi_name() === 'cli') { exit(updateProject()); } ?>