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

176 lines
7.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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