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

140 lines
7.1 KiB
PHP
Raw Permalink Normal View History

<?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);
// Нормализуем contact_id: допускаем как "12x12345", так и "12345"
$contactIdNumeric = preg_replace('/[^0-9]/', '', $contact_id);
$contactIdWithPrefix = '12x' . $contactIdNumeric;
$logstring = date('Y-m-d H:i:s').' Ищем проект по policy_number='.$policy_number.' И contact_id='.$contactIdNumeric.' (raw='.$contact_id.')'.PHP_EOL;
file_put_contents('logs/CreateWebProject.log', $logstring, FILE_APPEND);
global $adb, $current_user;
$isNew = false; // Флаг: создан ли проект сейчас
// Проверяем существование проекта по номеру полиса И прямой привязке к контакту
// (без зависимости от заполнения vtiger_crmentityrel)
$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 = ?
AND p.linktoaccountscontacts = ?
LIMIT 1";
$result = $adb->pquery($query, array($policy_number, $contactIdNumeric));
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' => $contactIdWithPrefix, // Привязка к контакту
'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!
}