Files
crm.clientright.ru/CreateCourtEvent.php
Fedor 75d3f7942b feat: Обновлены все URL Nextcloud с office.klientprav.tech на office.clientright.ru
Обновленные файлы:
- crm_extensions/nextcloud_api.php (2 места)
- modules/Documents/actions/NcPrepareEdit.php
- crm_extensions/nextcloud_editor/js/nextcloud-editor.js
- crm_extensions/file_storage/api/get_edit_urls.php
- crm_extensions/file_storage/api/simple_edit.php
- crm_extensions/README.md
- NEXTCLOUD_EDIT_BUTTON_IMPLEMENTATION.md
- crm_extensions/docs/NEXTCLOUD_EDITOR.md
- test_syntax_check.html
- crm_extensions/tests/test_edit_button.html

Все ссылки теперь указывают на новый сервер office.clientright.ru
Backup файлы и тестовые директории не изменены
2025-10-20 17:17:34 +03:00

278 lines
10 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
/**
* Создание события в календаре CRM для судебного заседания
*
* Принимает POST запрос с данными:
* - project_id: ID проекта (обязательно)
* - event_name: Название события
* - event_date: Дата события (формат DD.MM.YYYY)
* - event_time: Время события (формат HH:MM)
* - location: Место проведения
* - result: Результат события
* - basis: Основание
* - note: Примечание
* - publication_date: Дата размещения
*
* Возвращает JSON:
* {
* "success": true,
* "event_id": "4x12345",
* "message": "Событие успешно создано"
* }
*/
// Устанавливаем рабочую директорию
chdir(__DIR__);
require_once 'config.inc.php';
require_once 'include/utils/utils.php';
require_once 'includes/Loader.php';
vimport('includes.runtime.Globals');
require_once 'include/database/PearDatabase.php';
require_once 'modules/Users/Users.php';
require_once 'include/Webservices/Utils.php';
require_once 'include/Webservices/Create.php';
require_once 'include/Webservices/Retrieve.php';
require_once 'include/Webservices/Update.php';
// Логирование
function log_event_creation($level, $message) {
$log_file = 'logs/create_court_event.log';
$timestamp = date('Y-m-d H:i:s');
$log_entry = "{$timestamp} - {$level}: {$message}\n";
file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
}
// Функция для форматирования даты в формат CRM (YYYY-MM-DD)
function formatDateForCRM($dateString) {
if (empty($dateString)) {
return '';
}
// Если формат DD.MM.YYYY
if (preg_match('/^(\d{2})\.(\d{2})\.(\d{4})$/', $dateString, $matches)) {
return $matches[3] . '-' . $matches[2] . '-' . $matches[1];
}
// Если уже в формате YYYY-MM-DD
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateString)) {
return $dateString;
}
return $dateString;
}
// Функция для форматирования времени в формат CRM (HH:MM:SS)
function formatTimeForCRM($timeString) {
if (empty($timeString)) {
return '10:00:00'; // Время по умолчанию
}
// Если формат HH:MM
if (preg_match('/^(\d{1,2}):(\d{2})$/', $timeString, $matches)) {
return sprintf('%02d:%02d:00', $matches[1], $matches[2]);
}
// Если уже в формате HH:MM:SS
if (preg_match('/^\d{2}:\d{2}:\d{2}$/', $timeString)) {
return $timeString;
}
return '10:00:00';
}
try {
log_event_creation('INFO', '=== НАЧАЛО ОБРАБОТКИ ЗАПРОСА ===');
// Получаем данные из POST, stdin или argv
$data = [];
// Пробуем получить из stdin
$input = file_get_contents('php://stdin');
if (!empty($input)) {
log_event_creation('DEBUG', "Входные данные из stdin: " . $input);
$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Ошибка декодирования JSON из stdin: ' . json_last_error_msg());
}
}
// Если stdin пустой, пробуем php://input (для POST запросов)
if (empty($data)) {
$input = file_get_contents('php://input');
if (!empty($input)) {
log_event_creation('DEBUG', "Входные данные из php://input: " . $input);
$data = json_decode($input, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Ошибка декодирования JSON из php://input: ' . json_last_error_msg());
}
}
}
// Если всё ещё пусто, используем $_POST
if (empty($data)) {
log_event_creation('DEBUG', "Используем \$_POST");
$data = $_POST;
}
// Если всё ещё пусто, пробуем argv
if (empty($data) && !empty($argv)) {
log_event_creation('DEBUG', "Пробуем argv");
for ($i = 1; $i < count($argv); $i++) {
if (strpos($argv[$i], '=') !== false) {
list($key, $value) = explode('=', $argv[$i], 2);
$data[$key] = $value;
}
}
}
log_event_creation('DEBUG', "Итоговые данные: " . json_encode($data, JSON_UNESCAPED_UNICODE));
// Проверяем обязательные параметры
if (empty($data['project_id'])) {
throw new Exception('Параметр project_id обязателен');
}
$projectId = $data['project_id'];
// Извлекаем данные события
$eventName = $data['event_name'] ?? 'Судебное заседание';
$eventDate = $data['event_date'] ?? '';
$eventTime = $data['event_time'] ?? '';
$location = $data['location'] ?? '';
$result = $data['result'] ?? '';
$basis = $data['basis'] ?? '';
$note = $data['note'] ?? '';
$publicationDate = $data['publication_date'] ?? '';
log_event_creation('INFO', "Создаем событие для проекта: $projectId");
log_event_creation('DEBUG', "Название: $eventName, Дата: $eventDate, Время: $eventTime");
// Проверяем что дата не пустая
if (empty($eventDate)) {
throw new Exception('Дата события обязательна');
}
// Инициализируем пользователя CRM
$current_user = new Users();
$current_user->retrieveCurrentUserInfoFromFile(8); // Фёдор Коробков
log_event_creation('DEBUG', "Пользователь инициализирован: " . $current_user->user_name);
// Получаем проект через webservices чтобы узнать владельца
$projectWsId = vtws_getWebserviceEntityId('Project', $projectId);
$project = vtws_retrieve($projectWsId, $current_user);
log_event_creation('DEBUG', "Проект получен: " . $project['projectname']);
log_event_creation('DEBUG', "Владелец проекта: " . $project['assigned_user_id']);
// Форматируем дату и время для CRM
$formattedDate = formatDateForCRM($eventDate);
$formattedTime = formatTimeForCRM($eventTime);
// Формируем описание события
$description = "Автоматически созданное событие из судебного дела\n\n";
if (!empty($location)) {
$description .= "Место: $location\n";
}
if (!empty($result)) {
$description .= "Результат: $result\n";
}
if (!empty($basis)) {
$description .= "Основание: $basis\n";
}
if (!empty($note)) {
$description .= "Примечание: $note\n";
}
if (!empty($publicationDate)) {
$description .= "Дата размещения: $publicationDate\n";
}
// Создаем событие через webservices
$eventData = [
'subject' => $eventName,
'date_start' => $formattedDate,
'time_start' => $formattedTime,
'due_date' => $formattedDate,
'time_end' => date('H:i:s', strtotime($formattedTime) + 3600), // +1 час
'assigned_user_id' => $project['assigned_user_id'],
'activitytype' => 'Meeting', // Тип события
'eventstatus' => 'Planned', // Статус
'location' => $location,
'description' => $description,
'visibility' => 'Public'
];
log_event_creation('DEBUG', "Данные для создания события: " . json_encode($eventData, JSON_UNESCAPED_UNICODE));
// Создаем событие
$createdEvent = vtws_create('Calendar', $eventData, $current_user);
log_event_creation('SUCCESS', "Событие создано: " . $createdEvent['id']);
// Связываем событие с проектом через vtiger_seactivityrel
list(, $eventNumericId) = explode('x', $createdEvent['id']);
$adb = PearDatabase::getInstance();
$query = "INSERT INTO vtiger_seactivityrel (crmid, activityid) VALUES (?, ?)";
$adb->pquery($query, [$projectId, $eventNumericId]);
log_event_creation('SUCCESS', "Событие привязано к проекту");
// Обновляем поля проекта с информацией о последнем событии
try {
$updateData = [
'id' => $projectWsId,
'cf_1682' => $formattedDate, // Дата события
'cf_1684' => $formattedTime // Время события
];
vtws_update($updateData, $current_user);
log_event_creation('SUCCESS', "Поля проекта обновлены (cf_1682, cf_1684)");
} catch (Exception $e) {
log_event_creation('WARNING', "Не удалось обновить поля проекта: " . $e->getMessage());
}
// Формируем успешный ответ
$response = [
'success' => true,
'event_id' => $createdEvent['id'],
'event_numeric_id' => $eventNumericId,
'event_name' => $eventName,
'event_date' => $formattedDate,
'event_time' => $formattedTime,
'project_id' => $projectId,
'message' => 'Событие успешно создано и привязано к проекту'
];
log_event_creation('SUCCESS', "=== ОБРАБОТКА ЗАВЕРШЕНА УСПЕШНО ===");
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(0);
} catch (Exception $e) {
$error_message = $e->getMessage();
log_event_creation('ERROR', "Ошибка: $error_message");
log_event_creation('ERROR', "Стек: " . $e->getTraceAsString());
$response = [
'success' => false,
'error' => $error_message,
'timestamp' => date('Y-m-d H:i:s')
];
header('Content-Type: application/json; charset=utf-8');
http_response_code(500);
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(1);
}
?>