2025-11-01 12:51:54 +03:00
|
|
|
|
<?php
|
|
|
|
|
|
/*********************************************************************************
|
|
|
|
|
|
* API-интерфейс для создания Проекта из Web-формы (упрощённый)
|
2025-11-12 19:46:06 +03:00
|
|
|
|
* Обязательные поля: cf_1885 (номер полиса), contact_id (контакт)
|
|
|
|
|
|
* Логика: если проект с таким полисом И привязкой к контакту существует - возвращаем ID БЕЗ обновления
|
|
|
|
|
|
* (по одному полису может быть несколько застрахованных лиц!)
|
|
|
|
|
|
* Автор: Фёдор, 2025-11-02
|
2025-11-01 12:51:54 +03:00
|
|
|
|
********************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
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-формы
|
2025-11-12 19:46:06 +03:00
|
|
|
|
* Если проект с таким номером полиса И привязкой к контакту уже существует - просто возвращаем его ID
|
|
|
|
|
|
* (один полис может быть у нескольких застрахованных лиц!)
|
2025-11-01 12:51:54 +03:00
|
|
|
|
* @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) {
|
|
|
|
|
|
|
2025-11-01 16:53:20 +03:00
|
|
|
|
// ✅ Очищаем буфер вывода и подавляем warnings
|
|
|
|
|
|
ob_start();
|
|
|
|
|
|
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$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)){
|
2025-11-01 16:53:20 +03:00
|
|
|
|
ob_end_clean(); // Очищаем буфер перед exception
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$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)){
|
2025-11-01 16:53:20 +03:00
|
|
|
|
ob_end_clean(); // Очищаем буфер перед exception
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$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);
|
|
|
|
|
|
|
2025-11-12 19:46:06 +03:00
|
|
|
|
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contact_id.PHP_EOL;
|
2025-11-01 12:51:54 +03:00
|
|
|
|
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
|
|
|
|
|
|
|
|
|
|
|
|
global $adb, $current_user;
|
|
|
|
|
|
|
|
|
|
|
|
$isNew = false; // Флаг: создан ли проект сейчас
|
|
|
|
|
|
|
2025-11-12 19:46:06 +03:00
|
|
|
|
// Проверяем существование проекта по номеру полиса И привязке к контакту
|
|
|
|
|
|
// (т.к. по одному полису может быть несколько застрахованных лиц)
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$query = "SELECT p.projectid
|
|
|
|
|
|
FROM vtiger_project p
|
|
|
|
|
|
INNER JOIN vtiger_projectcf pcf ON p.projectid = pcf.projectid
|
2025-11-12 19:46:06 +03:00
|
|
|
|
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
|
2025-11-01 12:51:54 +03:00
|
|
|
|
LIMIT 1";
|
2025-11-12 19:46:06 +03:00
|
|
|
|
$result = $adb->pquery($query, array($contact_id, $contact_id, $policy_number));
|
2025-11-01 12:51:54 +03:00
|
|
|
|
|
|
|
|
|
|
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) {
|
2025-11-01 16:53:20 +03:00
|
|
|
|
ob_end_clean(); // Очищаем буфер перед exception
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$logstring = date('Y-m-d H:i:s').' ❌ Ошибка создания: '.$ex->getMessage().PHP_EOL;
|
|
|
|
|
|
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
|
|
|
|
|
|
throw $ex;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-01 16:53:20 +03:00
|
|
|
|
// Возвращаем массив с флагом is_new (vTiger сам сделает json_encode!)
|
2025-11-01 12:51:54 +03:00
|
|
|
|
$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);
|
|
|
|
|
|
|
2025-11-01 16:53:20 +03:00
|
|
|
|
// ✅ Очищаем буфер (удаляем все warnings/notices)
|
|
|
|
|
|
ob_end_clean();
|
|
|
|
|
|
|
|
|
|
|
|
return $result; // ← Массив, НЕ json_encode!
|
2025-11-12 19:46:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
|