Files
crm.clientright.ru/include/Webservices/CreateWebProject.php
Fedor 746367606e fix: CreateWebProject возвращает чистый JSON без BOM
-  CreateWebProject.php: возвращает массив (не json_encode)
-  CreateWebProject.php: ob_start/ob_end_clean для глушения warnings
-  Удалён closing tag ?> и лишние переносы
-  webservice.php: ob_clean() после includes (удаляет BOM)
-  Результат: чистый JSON без BOM и переносов
- 🎯 N8N теперь корректно парсит ответ

Связанные изменения:
- erv_platform: claim_id генерируется только в n8n
2025-11-01 16:53:20 +03:00

129 lines
6.3 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 (номер полиса)
* Логика: если проект с таким полисом существует - возвращаем ID БЕЗ обновления
* Автор: Фёдор, 2025-11-01
********************************************************************************/
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.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
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('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!
}