Files
crm.clientright.ru/include/Webservices/CreateClientProject.php

176 lines
7.1 KiB
PHP
Raw Permalink Normal View History

<?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;
}
}