176 lines
7.1 KiB
PHP
176 lines
7.1 KiB
PHP
<?php
|
||
/*********************************************************************************
|
||
* API-интерфейс для создания Проекта КлиентПрав из web-формы ticket_form
|
||
* Уникальность проекта обеспечивается по claim_id (cf_2620)
|
||
* Автор: GPT-5.1 Codex & Фёдор, 2025-11-15
|
||
********************************************************************************/
|
||
|
||
include_once 'include/Webservices/Query.php';
|
||
include_once 'modules/Users/Users.php';
|
||
require_once('include/Webservices/Utils.php');
|
||
require_once 'include/Webservices/Create.php';
|
||
require_once 'include/Webservices/Retrieve.php';
|
||
require_once 'includes/Loader.php';
|
||
vimport ('includes.runtime.Globals');
|
||
vimport ('includes.runtime.BaseModel');
|
||
vimport ('includes.runtime.LanguageHandler');
|
||
|
||
/**
|
||
* Создание проекта КлиентПрав по заявке ticket_form
|
||
*
|
||
* @param string $contact_id - ID контакта (обязательное)
|
||
* @param string $claim_id - Уникальный ID обращения (обязательное, cf_2620)
|
||
* @param string $session_id - Сессия фронтенда (опционально, cf_2618)
|
||
* @param string $description - Описание пользователя (опционально, description)
|
||
* @param string $ai_response - Ответ AI модели (опционально, cf_2622)
|
||
* @param string $phone - Телефон для генерации имени (опционально)
|
||
* @param string $firstname - Имя контакта (опционально)
|
||
* @param string $lastname - Фамилия контакта (опционально)
|
||
* @return array {project_id, project_name, is_new}
|
||
*/
|
||
function vtws_createclientproject($contact_id, $claim_id, $session_id = '', $description = '', $ai_response = '', $phone = '', $firstname = '', $lastname = '', $user = false) {
|
||
|
||
ob_start();
|
||
|
||
$logPrefix = date("Y-m-d H:i:s") . ' ';
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . json_encode($_REQUEST) . PHP_EOL, FILE_APPEND);
|
||
|
||
try {
|
||
global $adb, $current_user;
|
||
|
||
if (empty($claim_id)) {
|
||
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан claim_id");
|
||
}
|
||
|
||
if (empty($contact_id)) {
|
||
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан ID контакта");
|
||
}
|
||
|
||
$claim_id = trim($claim_id);
|
||
$session_id = trim($session_id);
|
||
|
||
// Нормализуем contact_id
|
||
$contactIdNumeric = preg_replace('/[^0-9]/', '', $contact_id);
|
||
$contactIdWithPrefix = '12x' . $contactIdNumeric;
|
||
|
||
// Подтягиваем данные контакта (фамилию/телефон), если не переданы
|
||
if (empty($lastname) || empty($firstname) || empty($phone)) {
|
||
try {
|
||
$contactRecord = vtws_retrieve($contactIdWithPrefix, $current_user);
|
||
if (empty($lastname) && !empty($contactRecord['lastname'])) {
|
||
$lastname = $contactRecord['lastname'];
|
||
}
|
||
if (empty($firstname) && !empty($contactRecord['firstname'])) {
|
||
$firstname = $contactRecord['firstname'];
|
||
}
|
||
if (empty($phone) && !empty($contactRecord['phone'])) {
|
||
$phone = preg_replace('/[^0-9]/', '', $contactRecord['phone']);
|
||
}
|
||
} catch (Exception $e) {
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . '⚠️ Не удалось получить контакт: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
|
||
}
|
||
}
|
||
|
||
$isNew = false;
|
||
$output = null;
|
||
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . "🔎 Ищем проект по claim_id={$claim_id}" . PHP_EOL, FILE_APPEND);
|
||
|
||
// Ищем проект по claim_id (cf_2620)
|
||
$query = "SELECT p.projectid
|
||
FROM vtiger_project p
|
||
INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid
|
||
INNER JOIN vtiger_crmentity e ON e.crmid = p.projectid
|
||
WHERE e.deleted = 0
|
||
AND pcf.cf_2620 = ?
|
||
LIMIT 1";
|
||
$result = $adb->pquery($query, array($claim_id));
|
||
|
||
if (!$result) {
|
||
throw new Exception("SQL error while searching project");
|
||
}
|
||
|
||
$projectName = '';
|
||
|
||
if ($adb->num_rows($result) > 0) {
|
||
$output = $adb->query_result($result, 0, 'projectid');
|
||
$isNew = false;
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . "✅ Проект найден по claim_id {$claim_id}: {$output}" . PHP_EOL, FILE_APPEND);
|
||
} else {
|
||
// Генерируем имя проекта
|
||
$lastname = trim($lastname);
|
||
if (!empty($lastname)) {
|
||
$projectName = $lastname . '_КлиентПрав';
|
||
} elseif (!empty($phone)) {
|
||
$projectName = $phone . '_КлиентПрав';
|
||
} else {
|
||
$projectName = 'КлиентПрав_' . $claim_id;
|
||
}
|
||
|
||
$params = array(
|
||
'projectname' => $projectName,
|
||
'projectstatus' => 'Черновик',
|
||
'projecttype' => 'претензионно-исковая работа',
|
||
'linktoaccountscontacts' => $contactIdWithPrefix,
|
||
'cf_1994' => '11x62345', // Заявитель (МОО КлиентПрав)
|
||
'cf_2620' => $claim_id,
|
||
'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id)
|
||
);
|
||
|
||
if (!empty($session_id)) {
|
||
$params['cf_2618'] = $session_id;
|
||
}
|
||
if (!empty($description)) {
|
||
$params['description'] = $description;
|
||
}
|
||
if (!empty($ai_response)) {
|
||
$params['cf_2622'] = $ai_response;
|
||
}
|
||
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . 'Массив для создания: ' . json_encode($params) . PHP_EOL, FILE_APPEND);
|
||
|
||
try {
|
||
$project = vtws_create('Project', $params, $current_user);
|
||
$output = substr($project['id'], 3);
|
||
$isNew = true;
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . "✅ Создан новый проект: {$output}" . PHP_EOL, FILE_APPEND);
|
||
} catch (WebServiceException $ex) {
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . '❌ Ошибка создания: ' . $ex->getMessage() . PHP_EOL, FILE_APPEND);
|
||
throw $ex;
|
||
}
|
||
}
|
||
|
||
// Получаем название проекта (если проект был найден, а не создан)
|
||
if (empty($projectName) && !empty($output)) {
|
||
try {
|
||
$query = "SELECT projectname FROM vtiger_project WHERE projectid = ? LIMIT 1";
|
||
$result = $adb->pquery($query, array($output));
|
||
if ($adb->num_rows($result) > 0) {
|
||
$projectName = $adb->query_result($result, 0, 'projectname');
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . "📝 Получено название проекта: {$projectName}" . PHP_EOL, FILE_APPEND);
|
||
}
|
||
} catch (Exception $e) {
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . '⚠️ Не удалось получить название проекта: ' . $e->getMessage() . PHP_EOL, FILE_APPEND);
|
||
}
|
||
}
|
||
|
||
$result = array(
|
||
'project_id' => $output,
|
||
'project_name' => $projectName,
|
||
'is_new' => $isNew
|
||
);
|
||
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . 'Return: ' . json_encode($result) . PHP_EOL, FILE_APPEND);
|
||
ob_end_clean();
|
||
|
||
return $result;
|
||
|
||
} catch (Exception $ex) {
|
||
file_put_contents('logs/CreateClientProject.log', $logPrefix . '❌ Exception: ' . $ex->getMessage() . PHP_EOL, FILE_APPEND);
|
||
ob_end_clean();
|
||
throw $ex;
|
||
}
|
||
}
|
||
|
||
|