From 5f4f99245d8fdb840489ecba5dd8d64211b9e42c Mon Sep 17 00:00:00 2001 From: Fedor Date: Sun, 2 Nov 2025 19:05:46 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BA=20HelpDesk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменения в upload_documents_to_crm.php: ✅ Добавлена логика привязки к HelpDesk (заявке) если указан ticket_id ✅ Если ticket_id не указан - привязываем к Project (старая логика) ✅ Обновлена функция normalizeInputData для передачи ticket_id ✅ Добавлено логирование привязки к HelpDesk/Project Использование: - Передать ticket_id в payload → документ привязывается к HelpDesk - Не передавать ticket_id → документ привязывается к Project --- upload_documents_to_crm.php | 93 +++++++++++++++++++++++++++---------- 1 file changed, 69 insertions(+), 24 deletions(-) diff --git a/upload_documents_to_crm.php b/upload_documents_to_crm.php index 52303449..43c07fb6 100644 --- a/upload_documents_to_crm.php +++ b/upload_documents_to_crm.php @@ -233,6 +233,7 @@ function normalizeInputData($data) { 'file_name' => $doc['file_name'] ?? $doc['original_file_name'] ?? '', 'description' => $doc['upload_description'] ?? $doc['description'] ?? '', 'projectid' => $projectid, + 'ticket_id' => $data['ticket_id'] ?? $doc['ticket_id'] ?? null, // ✅ Поддержка привязки к заявке 'user_id' => $data['user_id'] ?? $doc['user_id'] ?? 1, 'contactid' => $doc['contactid'] ?? $data['contactid'] ?? 0, 'pages' => $doc['pages'] ?? 0, @@ -446,31 +447,75 @@ function createDocumentsInCRM($filesArray, $userName = 'api') { // ВАЖНО: Обновляем S3 метаданные напрямую в базе данных $s3UpdateSuccess = updateDocumentS3Metadata($docNumericId, $s3Info, $fileSize, $f['file_name']); - // Привязываем к проекту - curl_setopt($ch, CURLOPT_POSTFIELDS, [ - 'operation' => 'AddRelated', - 'sessionName' => $sessionId, - 'sourceRecordId' => $projectWsId, - 'relatedRecordId' => $documentWsId, - ]); - $resp = curl_exec($ch); + // Определяем к чему привязываем: к HelpDesk (заявке) или к Project (проекту) + $ticketId = isset($f['ticket_id']) ? (int)$f['ticket_id'] : null; - // Проверяем успех AddRelated - $ok = false; - if ($resp !== false) { - $resp = ltrim($resp, "\xEF\xBB\xBF\x00\x09\x0A\x0D\x20"); - $rel = json_decode($resp, true); - $ok = isset($rel['result']['message']) && $rel['result']['message'] === 'successfull'; - } - - // Если webservice не сработал - используем прямую привязку - if (!$ok) { - writeLog("⚠️ AddRelated не сработал, используем прямую привязку"); - require_once 'data/CRMEntity.php'; - require_once 'modules/Vtiger/CRMEntity.php'; - list(, $docNumericId) = explode('x', $documentWsId, 2); - $focus = CRMEntity::getInstance('Project'); - relateEntities($focus, 'Project', (int)$f['projectid'], 'Documents', (int)$docNumericId); + if ($ticketId) { + // Привязываем к HelpDesk (заявке) + writeLog("📎 Привязываем к HelpDesk ticket_id: $ticketId"); + + // Получаем WS ID для HelpDesk + $rs = $adb->pquery("SELECT id FROM vtiger_ws_entity WHERE name=?", ['HelpDesk']); + $helpdeskPrefix = ($rs && $adb->num_rows($rs) > 0) ? $adb->query_result($rs, 0, 'id') : 17; + $ticketWsId = $helpdeskPrefix . 'x' . $ticketId; + + curl_setopt($ch, CURLOPT_POSTFIELDS, [ + 'operation' => 'AddRelated', + 'sessionName' => $sessionId, + 'sourceRecordId' => $ticketWsId, + 'relatedRecordId' => $documentWsId, + ]); + $resp = curl_exec($ch); + + // Проверяем успех AddRelated + $ok = false; + if ($resp !== false) { + $resp = ltrim($resp, "\xEF\xBB\xBF\x00\x09\x0A\x0D\x20"); + $rel = json_decode($resp, true); + $ok = isset($rel['result']['message']) && $rel['result']['message'] === 'successfull'; + } + + // Если webservice не сработал - используем прямую привязку + if (!$ok) { + writeLog("⚠️ AddRelated к HelpDesk не сработал, используем прямую привязку"); + require_once 'data/CRMEntity.php'; + require_once 'modules/Vtiger/CRMEntity.php'; + $focus = CRMEntity::getInstance('HelpDesk'); + relateEntities($focus, 'HelpDesk', $ticketId, 'Documents', (int)$docNumericId); + } + + writeLog("✅ Документ привязан к HelpDesk #$ticketId"); + } else { + // Привязываем к проекту (старая логика) + writeLog("📎 Привязываем к Project project_id: {$f['projectid']}"); + + curl_setopt($ch, CURLOPT_POSTFIELDS, [ + 'operation' => 'AddRelated', + 'sessionName' => $sessionId, + 'sourceRecordId' => $projectWsId, + 'relatedRecordId' => $documentWsId, + ]); + $resp = curl_exec($ch); + + // Проверяем успех AddRelated + $ok = false; + if ($resp !== false) { + $resp = ltrim($resp, "\xEF\xBB\xBF\x00\x09\x0A\x0D\x20"); + $rel = json_decode($resp, true); + $ok = isset($rel['result']['message']) && $rel['result']['message'] === 'successfull'; + } + + // Если webservice не сработал - используем прямую привязку + if (!$ok) { + writeLog("⚠️ AddRelated не сработал, используем прямую привязку"); + require_once 'data/CRMEntity.php'; + require_once 'modules/Vtiger/CRMEntity.php'; + list(, $docNumericId) = explode('x', $documentWsId, 2); + $focus = CRMEntity::getInstance('Project'); + relateEntities($focus, 'Project', (int)$f['projectid'], 'Documents', (int)$docNumericId); + } + + writeLog("✅ Документ привязан к Project #{$f['projectid']}"); } // Возвращаем все входные данные + результат