Files
crm.clientright.ru/include/Webservices/CreateWebProjectV2.php
Fedor aec27abeb0 feat: add docx renderer service and stabilize AI drawer waits
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.
2026-03-26 13:00:14 +03:00

164 lines
6.9 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-формы (версия 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);
}
?>