adb = $adb; // Получаем системного пользователя $this->current_user = Users::getActiveAdminUser(); } /** * Поиск проекта по данным из документа */ public function findProject($content) { $plaintiff_fio = $content['plaintiff_fio'] ?? ''; $case_number = $content['case_number'] ?? ''; $uid = $content['uid'] ?? ''; // Поиск по ФИО истца if ($plaintiff_fio) { $sql = "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 ?)"; $params = ["%$plaintiff_fio%", "%$plaintiff_fio%"]; $result = $this->adb->pquery($sql, $params); if ($this->adb->num_rows($result) > 0) { $row = $this->adb->fetchByAssoc($result); return $row['projectid']; } } // Поиск по номеру дела if ($case_number) { $sql = "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 ?)"; $params = ["%$case_number%", "%$case_number%"]; $result = $this->adb->pquery($sql, $params); if ($this->adb->num_rows($result) > 0) { $row = $this->adb->fetchByAssoc($result); return $row['projectid']; } } // Поиск по УИД if ($uid) { $sql = "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 ?"; $params = ["%$uid%"]; $result = $this->adb->pquery($sql, $params); if ($this->adb->num_rows($result) > 0) { $row = $this->adb->fetchByAssoc($result); return $row['projectid']; } } return null; } /** * Обновление проекта */ public function updateProject($project_id, $content) { try { // Получаем запись проекта $project = Vtiger_Record_Model::getInstanceById($project_id, 'Project'); // Обновляем описание с новыми данными $current_description = $project->get('description') ?: ''; $new_info = $this->formatDocumentInfo($content); // Добавляем информацию о документе в описание $updated_description = $current_description . "\n\n" . $new_info; // Обновляем поля проекта $project->set('description', $updated_description); // Обновляем статус если нужно $current_status = $project->get('projectstatus'); if ($current_status === 'представительство в суде 1й инстанции') { $project->set('projectstatus', 'получено определение суда'); } // Сохраняем изменения $project->save(); return [ 'success' => true, 'project_id' => $project_id, 'message' => 'Проект успешно обновлен' ]; } catch (Exception $e) { return [ 'success' => false, 'error' => 'Ошибка обновления проекта: ' . $e->getMessage() ]; } } /** * Загрузка документа в CRM */ public function uploadDocument($project_id, $file_url, $file_name, $content) { try { // Скачиваем файл $file_content = file_get_contents($file_url); if ($file_content === false) { throw new Exception('Не удалось скачать файл'); } // Создаем временный файл $temp_file = tempnam(sys_get_temp_dir(), 'crm_doc_'); file_put_contents($temp_file, $file_content); // Создаем запись документа $document = Vtiger_Record_Model::getCleanInstance('Documents'); // Формируем название документа $document_title = $this->formatDocumentTitle($content); $document->set('notes_title', $document_title); $document->set('filename', $file_name); $document->set('filetype', 'application/pdf'); $document->set('filesize', strlen($file_content)); $document->set('filelocationtype', 'E'); // External $document->set('folderid', 3); // Documents folder // Сохраняем документ $document->save(); // Прикрепляем файл $document->uploadAndSaveFile($temp_file, $file_name); // Связываем документ с проектом $this->linkDocumentToProject($document->getId(), $project_id); // Удаляем временный файл unlink($temp_file); return [ 'success' => true, 'document_id' => $document->getId(), 'message' => 'Документ успешно загружен' ]; } catch (Exception $e) { return [ 'success' => false, 'error' => 'Ошибка загрузки документа: ' . $e->getMessage() ]; } } /** * Связывание документа с проектом */ private function linkDocumentToProject($document_id, $project_id) { $sql = "INSERT INTO vtiger_senotesrel (crmid, notesid) VALUES (?, ?)"; $this->adb->pquery($sql, [$project_id, $document_id]); } /** * Форматирование информации о документе */ private function formatDocumentInfo($content) { $info = "=== СУДЕБНЫЙ ДОКУМЕНТ ===\n"; $info .= "Дата получения: " . date('d.m.Y H:i:s') . "\n"; if (!empty($content['case_number'])) { $info .= "Номер дела: " . $content['case_number'] . "\n"; } if (!empty($content['uid'])) { $info .= "УИД: " . $content['uid'] . "\n"; } if (!empty($content['court'])) { $info .= "Суд: " . $content['court'] . "\n"; } if (!empty($content['plaintiff_fio'])) { $info .= "Истец: " . $content['plaintiff_fio'] . "\n"; } if (!empty($content['defendant_fio'])) { $info .= "Ответчик: " . $content['defendant_fio'] . "\n"; } if (!empty($content['document_title'])) { $info .= "Тип документа: " . $content['document_title'] . "\n"; } if (!empty($content['description'])) { $info .= "Описание: " . $content['description'] . "\n"; } return $info; } /** * Форматирование названия документа */ private function formatDocumentTitle($content) { $title = "СУДЕБНЫЙ ДОКУМЕНТ"; if (!empty($content['document_title'])) { $title = $content['document_title']; } if (!empty($content['case_number'])) { $title .= " по делу " . $content['case_number']; } if (!empty($content['plaintiff_fio'])) { $title .= " " . $content['plaintiff_fio']; } $title .= " " . date('d.m.Y'); return $title; } /** * Логирование действий */ private function logAction($action, $data) { $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') . " - $action: " . json_encode($data, JSON_UNESCAPED_UNICODE) . "\n"; file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); } } /** * Основная функция */ function main() { try { // Получаем входные данные $input = ''; if (isset($argv[1])) { // Данные переданы как аргумент командной строки $input = $argv[1]; } else { // Данные переданы через stdin $input = stream_get_contents(STDIN); } if (empty($input)) { throw new Exception('Не указаны входные данные'); } // Парсим JSON $data = json_decode($input, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception('Ошибка парсинга JSON: ' . json_last_error_msg()); } // Проверяем структуру данных if (!isset($data['content']) || !is_array($data['content'])) { throw new Exception('Неверная структура данных: отсутствует content'); } $content = $data['content']; $file_url = $data['file'] ?? ''; $file_name = $data['file_name'] ?? ''; // Создаем экземпляр обновлятеля $updater = new ProjectUpdater(); // Ищем проект $project_id = $updater->findProject($content); if (!$project_id) { throw new Exception('Проект не найден по указанным данным'); } // Обновляем проект $update_result = $updater->updateProject($project_id, $content); if (!$update_result['success']) { throw new Exception($update_result['error']); } // Загружаем документ если указан $upload_result = null; if (!empty($file_url) && !empty($file_name)) { $upload_result = $updater->uploadDocument($project_id, $file_url, $file_name, $content); } // Формируем результат $result = [ 'success' => true, 'project_id' => $project_id, 'update_result' => $update_result, 'upload_result' => $upload_result, 'message' => 'Проект успешно обновлен' ]; // Логируем действие $updater->logAction('PROJECT_UPDATE_SUCCESS', $result); // Выводим результат 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') ]; // Логируем ошибку if (isset($updater)) { $updater->logAction('PROJECT_UPDATE_ERROR', $error_result); } echo json_encode($error_result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); return 1; } } // Запускаем скрипт if (php_sapi_name() === 'cli') { exit(main()); } ?>