Files
crm.clientright.ru/CreateProjectAdvanced.php
Fedor 01c4fe80b5 chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
2026-03-26 14:19:01 +03:00

258 lines
14 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-интерфейс для создания Проекта с расширенными данными
* All Rights Reserved.
* Contributor(s): AI Assistant
********************************************************************************/
require_once("config.php");
require_once("include/Webservices/Utils.php");
require_once("include/Webservices/Create.php");
require_once("include/Webservices/Update.php");
require_once("include/Webservices/UpsertProject.php");
require_once("includes/Loader.php");
vimport ('includes.runtime.Globals');
vimport ('includes.runtime.BaseModel');
vimport ('includes.runtime.LanguageHandler');
// Устанавливаем заголовки для JSON
header('Content-Type: application/json');
// Получаем данные из POST (поддерживаем и JSON и form-data)
$rawInput = file_get_contents('php://input');
$input = null;
// Проверяем Content-Type
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
// Детальное логирование входящих данных
$logstring = date("Y-m-d H:i:s").' ===== CreateProjectAdvanced REQUEST START ====='.PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' Content-Type: '.$contentType.PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' Raw POST data: '.$rawInput.PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' $_POST data: '.json_encode($_POST, JSON_UNESCAPED_UNICODE).PHP_EOL;
if (strpos($contentType, 'application/json') !== false) {
// JSON данные
$input = json_decode($rawInput, true);
$logstring .= date("Y-m-d H:i:s").' Parsed JSON: '.json_encode($input, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT).PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' JSON decode error: '.(json_last_error_msg()).PHP_EOL;
} else {
// Form данные
$input = $_POST;
$logstring .= date("Y-m-d H:i:s").' Parsed FORM: '.json_encode($input, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT).PHP_EOL;
}
// ✅ Парсим project_json, если он передан (для n8n workflow)
if (isset($input['project_json']) && !empty($input['project_json'])) {
$projectJson = $input['project_json'];
// project_json может быть строкой JSON или уже объектом
if (is_string($projectJson)) {
$projectData = json_decode($projectJson, true);
if ($projectData !== null) {
$logstring .= date("Y-m-d H:i:s").' Parsed project_json: '.json_encode($projectData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT).PHP_EOL;
// Извлекаем contactid из project_json (может быть contact_id или contactid)
if (empty($input['contactid']) && !empty($projectData['contactid'])) {
$input['contactid'] = $projectData['contactid'];
} elseif (empty($input['contactid']) && !empty($projectData['contact_id'])) {
$input['contactid'] = $projectData['contact_id'];
}
// Извлекаем offenderid из project_json или из result.accounts[0].account_id
if (empty($input['offenderid'])) {
// Сначала проверяем, есть ли offenderid напрямую
if (!empty($projectData['offenderid'])) {
$input['offenderid'] = $projectData['offenderid'];
} else {
// Пытаемся извлечь из result.accounts[0].account_id
if (!empty($projectData['result'])) {
$resultData = $projectData['result'];
// result может быть строкой JSON или объектом
if (is_string($resultData)) {
$resultData = json_decode($resultData, true);
}
if ($resultData !== null && isset($resultData['accounts']) && is_array($resultData['accounts']) && count($resultData['accounts']) > 0) {
if (!empty($resultData['accounts'][0]['account_id'])) {
$input['offenderid'] = $resultData['accounts'][0]['account_id'];
$logstring .= date("Y-m-d H:i:s").' Extracted offenderid from result.accounts[0].account_id: '.$input['offenderid'].PHP_EOL;
}
}
}
}
}
// Копируем projectdata из project_json, если не передано напрямую
if (empty($input['projectdata']) && !empty($projectData['projectdata'])) {
$input['projectdata'] = $projectData['projectdata'];
}
// Копируем другие поля из project_json
if (empty($input['project_id']) && !empty($projectData['project_id'])) {
$input['project_id'] = $projectData['project_id'];
}
if (empty($input['claim_id']) && !empty($projectData['claim_id'])) {
$input['claim_id'] = $projectData['claim_id'];
}
} else {
$logstring .= date("Y-m-d H:i:s").' Failed to parse project_json: '.json_last_error_msg().PHP_EOL;
}
}
}
$logstring .= date("Y-m-d H:i:s").' Final input after project_json parsing: '.json_encode($input, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT).PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' ===== CreateProjectAdvanced REQUEST END ====='.PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
// ✅ Если операция UpsertProject - используем специальный метод
// ВАЖНО: Старая логика (без operation='UpsertProject') продолжает работать как раньше
$operation = $input['operation'] ?? '';
if ($operation === 'UpsertProject' && !empty($input['project_json'])) {
try {
// Инициализируем пользователя
$seed_user = new Users();
$current_user = $seed_user->retrieveCurrentUserInfoFromFile(1);
// Вызываем vtws_upsertproject
$projectJson = is_string($input['project_json']) ? $input['project_json'] : json_encode($input['project_json']);
$result = vtws_upsertproject($projectJson, $current_user);
// Возвращаем результат
echo $result;
exit;
} catch (Exception $e) {
$logstring = date('Y-m-d H:i:s').' UpsertProject error: '.$e->getMessage().PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
http_response_code(500);
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
exit;
}
}
// Если operation !== 'UpsertProject' или project_json пустой - продолжаем старую логику ниже
// Валидация обязательных полей
if (empty($input['contactid']) || empty($input['offenderid'])) {
$logstring = date("Y-m-d H:i:s").' Missing required fields: contactid or offenderid'.PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' contactid: '.(isset($input['contactid']) ? $input['contactid'] : 'NOT SET').PHP_EOL;
$logstring .= date("Y-m-d H:i:s").' offenderid: '.(isset($input['offenderid']) ? $input['offenderid'] : 'NOT SET').PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Missing required fields: contactid or offenderid']);
exit;
}
try {
global $adb;
// Инициализируем пользователя (захардкодим как в оригинале)
$seed_user = new Users();
$current_user = $seed_user->retrieveCurrentUserInfoFromFile(1); // Пользователь с ID 1
$contactid = $input['contactid'];
$offenderid = $input['offenderid'];
$applicantid = $input['applicantid'] ?? $contactid; // Заявитель, по умолчанию = контакт
$projectData = $input['projectdata'] ?? [];
// Получаем название контакта для названия проекта
$query = "select c.lastname
from vtiger_contactdetails c
left join vtiger_crmentity e on e.crmid = c.contactid
where e.deleted = 0 and c.contactid = ?
limit 1";
$result = $adb->pquery($query, array($contactid));
$contactName = $adb->query_result($result, 0, 'lastname');
// Получаем название контрагента для названия проекта
$query = "select a.accountname
from vtiger_account a
left join vtiger_crmentity e on e.crmid = a.accountid
where e.deleted = 0 and a.accountid = ?
limit 1";
$result = $adb->pquery($query, array($offenderid));
$accountName = $adb->query_result($result, 0, 'accountname');
// Формируем название проекта
$projectName = $contactName . ' ' . $accountName;
// Основные поля модуля Проекты
$params = array (
'projectname' => $projectName,
'linktoaccountscontacts' => '12x'.$contactid,
'cf_2274' => '11x'.$offenderid,
'projectstatus' => 'модерация',
'projecttype' => 'Претензионно - исковая работа',
'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id)
);
// Заявитель по умолчанию (если не придет из projectdata или как отдельное поле)
if (!isset($projectData['cf_1994']) && !isset($input['cf_1994'])) {
$params['cf_1994'] = vtws_getWebserviceEntityId('Accounts', 62345); // МОО КЛИЕНТПРАВ
}
// Логируем assigned_user_id для отладки
$logstring = date('Y-m-d H:i:s').' assigned_user_id: '.vtws_getWebserviceEntityId('Users', $current_user->id).' (current_user->id: '.$current_user->id.')'.PHP_EOL;
$logstring .= date('Y-m-d H:i:s').' applicantid: '.$applicantid.' (cf_1994: 12x'.$applicantid.')'.PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
// Обрабатываем cf_1994 как отдельное поле (если пришло)
if (isset($input['cf_1994'])) {
$params['cf_1994'] = vtws_getWebserviceEntityId('Accounts', $input['cf_1994']); // Поле cf_1994 ссылается на Accounts
}
// Заполняем поля из projectdata
if (!empty($projectData)) {
// Основные поля
if (isset($projectData['cf_2206'])) $params['cf_2206'] = $projectData['cf_2206'];
if (isset($projectData['cf_1994'])) {
// Заявитель из projectdata - поле cf_1994 ссылается на Accounts
$params['cf_1994'] = vtws_getWebserviceEntityId('Accounts', $projectData['cf_1994']);
}
if (isset($projectData['cf_2210'])) $params['cf_2210'] = $projectData['cf_2210'];
if (isset($projectData['cf_2212'])) $params['cf_2212'] = $projectData['cf_2212'];
if (isset($projectData['cf_2214'])) $params['cf_2214'] = $projectData['cf_2214'];
if (isset($projectData['cf_1830'])) $params['cf_1830'] = $projectData['cf_1830'];
if (isset($projectData['cf_1469'])) $params['cf_1469'] = $projectData['cf_1469'];
// Условия договора
if (isset($projectData['cf_1191'])) $params['cf_1191'] = $projectData['cf_1191'];
if (isset($projectData['cf_1189'])) $params['cf_1189'] = $projectData['cf_1189'];
if (isset($projectData['cf_1203'])) $params['cf_1203'] = $projectData['cf_1203'];
if (isset($projectData['cf_1839'])) $params['cf_1839'] = $projectData['cf_1839'];
if (isset($projectData['cf_1841'])) $params['cf_1841'] = $projectData['cf_1841'];
if (isset($projectData['cf_1207'])) $params['cf_1207'] = $projectData['cf_1207'];
if (isset($projectData['cf_1479'])) $params['cf_1479'] = $projectData['cf_1479'];
if (isset($projectData['cf_1231'])) $params['cf_1231'] = $projectData['cf_1231'];
if (isset($projectData['cf_1239'])) $params['cf_1239'] = $projectData['cf_1239'];
if (isset($projectData['cf_1566'])) $params['cf_1566'] = $projectData['cf_1566'];
if (isset($projectData['cf_1564'])) $params['cf_1564'] = $projectData['cf_1564'];
if (isset($projectData['cf_1249'])) $params['cf_1249'] = $projectData['cf_1249'];
if (isset($projectData['description'])) $params['description'] = $projectData['description'];
// Претензионный порядок
if (isset($projectData['cf_1471'])) $params['cf_1471'] = $projectData['cf_1471'];
if (isset($projectData['cf_1473'])) $params['cf_1473'] = $projectData['cf_1473'];
if (isset($projectData['cf_1475'])) $params['cf_1475'] = $projectData['cf_1475'];
}
$logstring = date('Y-m-d H:i:s').' CreateProjectAdvanced params: '.json_encode($params).PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
// Создаем проект
$project = vtws_create('Project', $params, $current_user);
$projectId = substr($project['id'], 3);
$logstring = date('Y-m-d H:i:s').' CreateProjectAdvanced success: project created with id '.$projectId.PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
echo json_encode(['success' => true, 'projectid' => $projectId]);
} catch (Exception $e) {
$logstring = date('Y-m-d H:i:s').' CreateProjectAdvanced error: '.$e->getMessage().PHP_EOL;
file_put_contents('logs/CreateProjectAdvanced.log', $logstring, FILE_APPEND);
http_response_code(500);
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}
?>