Files
crm.clientright.ru/CreateCourtEvent.php

278 lines
10 KiB
PHP
Raw Normal View History

<?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);
}
?>