Create a self-hosted DOCX template rendering microservice with API key auth, Docker deployment, and usage docs, and extend AI Drawer fallback waiting to avoid premature timeout errors during long n8n processing.
164 lines
6.9 KiB
PHP
164 lines
6.9 KiB
PHP
<?php
|
||
/*********************************************************************************
|
||
* API-интерфейс для создания Проекта из Web-формы (версия 2)
|
||
* Принимает JSON с данными проекта
|
||
* Обязательное поле: только cf_1885 (номер полиса)
|
||
* Логика: если проект с таким номером полиса существует - возвращаем ID БЕЗ обновления
|
||
* Автор: Фёдор, 2025-12-17
|
||
********************************************************************************/
|
||
|
||
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 'includes/Loader.php';
|
||
vimport ('includes.runtime.Globals');
|
||
vimport ('includes.runtime.BaseModel');
|
||
vimport ('includes.runtime.LanguageHandler');
|
||
|
||
/**
|
||
* Создание проекта из web-формы (версия 2 с JSON)
|
||
* Если проект с таким номером полиса уже существует - просто возвращаем его ID
|
||
*
|
||
* @param string $project_json - JSON строка с данными проекта:
|
||
* {
|
||
* "cf_1885": "E50208-306083026",
|
||
* "cf_1887": "19-11-2025",
|
||
* "cf_1889": "24-11-2025",
|
||
* "cf_2446": "..."
|
||
* }
|
||
* Примечание: sessionName передается отдельным параметром в запросе, не в JSON!
|
||
* @return string - JSON строка с project_id и is_new
|
||
*/
|
||
function vtws_createwebprojectv2($project_json, $user = false) {
|
||
|
||
$logFile = 'logs/CreateWebProjectV2.log';
|
||
$logstring = date("Y-m-d H:i:s").' REQUEST: '.json_encode($_REQUEST);
|
||
file_put_contents($logFile, $logstring.PHP_EOL, FILE_APPEND);
|
||
|
||
global $adb, $current_user;
|
||
|
||
// ========================================
|
||
// 1. ОЧИСТКА И ПАРСИНГ JSON
|
||
// ========================================
|
||
$project_json = trim($project_json);
|
||
$project_json = preg_replace('/^\xEF\xBB\xBF/', '', $project_json); // Убираем BOM
|
||
|
||
// Если строка обёрнута в кавычки — убираем
|
||
if (preg_match('/^".*"$/s', $project_json)) {
|
||
$project_json = substr($project_json, 1, -1);
|
||
$project_json = stripcslashes($project_json);
|
||
}
|
||
|
||
$logstring = date("Y-m-d H:i:s").' CLEANED JSON: '.substr($project_json, 0, 500);
|
||
file_put_contents($logFile, $logstring.PHP_EOL, FILE_APPEND);
|
||
|
||
// Парсим JSON
|
||
$data = json_decode($project_json, true);
|
||
|
||
if (json_last_error() !== JSON_ERROR_NONE) {
|
||
$error = 'Ошибка парсинга JSON: ' . json_last_error_msg();
|
||
file_put_contents($logFile, date("Y-m-d H:i:s") . ' ❌ ' . $error . PHP_EOL, FILE_APPEND);
|
||
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, $error);
|
||
}
|
||
|
||
// Извлекаем данные
|
||
$policy_number = trim($data['cf_1885'] ?? '');
|
||
$period_start = trim($data['cf_1887'] ?? '');
|
||
$period_end = trim($data['cf_1889'] ?? '');
|
||
$cf_2446 = trim($data['cf_2446'] ?? '');
|
||
|
||
// ========================================
|
||
// 2. ВАЛИДАЦИЯ
|
||
// ========================================
|
||
if(empty($policy_number)){
|
||
$logstring = date("Y-m-d H:i:s").' Не указано обязательное поле: cf_1885 (номер полиса)';
|
||
file_put_contents($logFile, $logstring.PHP_EOL, FILE_APPEND);
|
||
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан номер полиса (cf_1885)");
|
||
}
|
||
|
||
// Валидация: убираем пробелы из номера полиса
|
||
$policy_number = trim($policy_number);
|
||
|
||
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
|
||
$isNew = false; // Флаг: создан ли проект сейчас
|
||
|
||
// ========================================
|
||
// 3. ПОИСК СУЩЕСТВУЮЩЕГО ПРОЕКТА
|
||
// ========================================
|
||
// Ищем только по номеру полиса (БЕЗ привязки к контакту)
|
||
$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_1885 = ?
|
||
LIMIT 1";
|
||
$result = $adb->pquery($query, array($policy_number));
|
||
|
||
if ($adb->num_rows($result) > 0) {
|
||
// Проект существует - ПРОСТО ВОЗВРАЩАЕМ ID (НЕ обновляем!)
|
||
$output = $adb->query_result($result, 0, 'projectid');
|
||
$isNew = false;
|
||
$logstring = date('Y-m-d H:i:s').' ✅ Проект найден с id '.$output.' (БЕЗ обновления)'.PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
} else {
|
||
// Проект НЕ существует - создаём новый
|
||
|
||
// Формируем название проекта
|
||
$projectname = 'ERV ' . $policy_number . ' цифровой адвокат';
|
||
|
||
$params = array (
|
||
'projectname' => $projectname,
|
||
'projectstatus' => 'модерация',
|
||
'projecttype' => 'ЕРВ урегулирование',
|
||
// ❌ УБРАНО: linktoaccountscontacts - нет привязки к контакту
|
||
'cf_1994' => '11x67458', // Заявитель (контрагент record=67458)
|
||
'cf_1885' => $policy_number, // Номер полиса
|
||
'assigned_user_id' => '19x8' // ✅ Ответственный = пользователь с ID 8
|
||
);
|
||
|
||
// Дополнительные необязательные поля
|
||
if (!empty($period_start)) {
|
||
$params['cf_1887'] = $period_start; // Период страхования начало
|
||
}
|
||
if (!empty($period_end)) {
|
||
$params['cf_1889'] = $period_end; // Период страхования конец
|
||
}
|
||
if (!empty($cf_2446)) {
|
||
$params['cf_2446'] = $cf_2446;
|
||
}
|
||
|
||
$logstring = date('Y-m-d H:i:s').' Массив для создания Web Проекта: '.json_encode($params).PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
|
||
try {
|
||
$project = vtws_create('Project', $params, $current_user);
|
||
$output = substr($project['id'], 3);
|
||
$isNew = true; // Проект только что создан!
|
||
$logstring = date('Y-m-d H:i:s').' ✅ Создан новый Web Проект с id '.$output.PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
} catch (WebServiceException $ex) {
|
||
$logstring = date('Y-m-d H:i:s').' ❌ Ошибка создания: '.$ex->getMessage().PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
throw $ex;
|
||
}
|
||
}
|
||
|
||
// Возвращаем JSON с флагом is_new
|
||
$result = array(
|
||
'project_id' => $output,
|
||
'is_new' => $isNew
|
||
);
|
||
|
||
$logstring = date('Y-m-d H:i:s').' Return: '.json_encode($result).PHP_EOL;
|
||
file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
|
||
return json_encode($result);
|
||
}
|
||
?>
|
||
|
||
|