Files
crm.clientright.ru/include/Webservices/CreateWebProject.php
Fedor cd90b0d58a feat: Добавлен инструмент генерации документов для AI Ассистента
- Создан API create_document_with_text.php для создания DOCX/XLSX/PPTX с текстом от AI
- Поддержка Markdown форматирования (заголовки, жирный, курсив, списки, код)
- Установлен PHPWord для красивого форматирования документов
- Исправлены пути сохранения (crm2/CRM_Active_Files/... без /crm/ в начале)
- Замена пробелов на подчеркивания в именах папок
- Создана документация для AI и разработчиков
- Добавлены API для работы с шаблонами Nextcloud
2025-11-12 19:46:06 +03:00

139 lines
7.0 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-формы (упрощённый)
* Обязательные поля: cf_1885 (номер полиса), contact_id (контакт)
* Логика: если проект с таким полисом И привязкой к контакту существует - возвращаем ID БЕЗ обновления
* (по одному полису может быть несколько застрахованных лиц!)
* Автор: Фёдор, 2025-11-02
********************************************************************************/
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-формы
* Если проект с таким номером полиса И привязкой к контакту уже существует - просто возвращаем его ID
* (один полис может быть у нескольких застрахованных лиц!)
* @param string $policy_number - номер полиса (обязательное поле) - cf_1885
* @param string $contact_id - ID контакта для привязки (обязательное поле)
* @param string $period_start - дата начала страхования (опционально) - cf_1887
* @param string $period_end - дата окончания страхования (опционально) - cf_1889
* @return string - JSON: {"project_id": "123", "is_new": true/false}
*/
function vtws_createwebproject($policy_number, $contact_id, $period_start = '', $period_end = '', $user = false) {
// ✅ Очищаем буфер вывода и подавляем warnings
ob_start();
$logstring = date("Y-m-d H:i:s").' '.json_encode($_REQUEST);
file_put_contents('logs/CreateWebProject.log', $logstring.PHP_EOL, FILE_APPEND);
// Проверка обязательных полей
if(empty($policy_number)){
ob_end_clean(); // Очищаем буфер перед exception
$logstring = date("Y-m-d H:i:s").' Не указано обязательное поле: policy_number (cf_1885)';
file_put_contents('logs/CreateWebProject.log', $logstring.PHP_EOL, FILE_APPEND);
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан номер полиса");
}
if(empty($contact_id)){
ob_end_clean(); // Очищаем буфер перед exception
$logstring = date("Y-m-d H:i:s").' Не указано обязательное поле: contact_id';
file_put_contents('logs/CreateWebProject.log', $logstring.PHP_EOL, FILE_APPEND);
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан ID контакта");
}
// Валидация: убираем пробелы из номера полиса
$policy_number = trim($policy_number);
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contact_id.PHP_EOL;
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
global $adb, $current_user;
$isNew = false; // Флаг: создан ли проект сейчас
// Проверяем существование проекта по номеру полиса И привязке к контакту
// (т.к. по одному полису может быть несколько застрахованных лиц)
$query = "SELECT p.projectid
FROM vtiger_project p
INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid
LEFT JOIN vtiger_crmentity e ON e.crmid = p.projectid
LEFT JOIN vtiger_crmentityrel rel ON
(rel.crmid = p.projectid AND rel.relcrmid = ?)
OR (rel.relcrmid = p.projectid AND rel.crmid = ?)
WHERE e.deleted = 0
AND pcf.cf_1885 = ?
AND rel.crmid IS NOT NULL
LIMIT 1";
$result = $adb->pquery($query, array($contact_id, $contact_id, $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('logs/CreateWebProject.log', $logstring, FILE_APPEND);
} else {
// Проект НЕ существует - создаём новый
// Формируем название проекта
$projectname = 'ERV ' . $policy_number . ' цифровой адвокат';
$params = array (
'projectname' => $projectname,
'projectstatus' => 'модерация',
'projecttype' => 'ерв урегулирование',
'linktoaccountscontacts' => '12x'.$contact_id, // Привязка к контакту
'cf_1994' => '11x67458', // Заявитель (контрагент record=67458)
'cf_1885' => $policy_number, // Номер полиса
'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id)
);
// Дополнительные необязательные поля
if (!empty($period_start)) {
$params['cf_1887'] = $period_start; // Период страхования начало
}
if (!empty($period_end)) {
$params['cf_1889'] = $period_end; // Период страхования конец
}
$logstring = date('Y-m-d H:i:s').' Массив для создания Web Проекта: '.json_encode($params).PHP_EOL;
file_put_contents('logs/CreateWebProject.log', $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('logs/CreateWebProject.log', $logstring, FILE_APPEND);
} catch (WebServiceException $ex) {
ob_end_clean(); // Очищаем буфер перед exception
$logstring = date('Y-m-d H:i:s').' ❌ Ошибка создания: '.$ex->getMessage().PHP_EOL;
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
throw $ex;
}
}
// Возвращаем массив с флагом is_new (vTiger сам сделает json_encode!)
$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('logs/CreateWebProject.log', $logstring, FILE_APPEND);
// ✅ Очищаем буфер (удаляем все warnings/notices)
ob_end_clean();
return $result; // ← Массив, НЕ json_encode!
}